Задача от пользователя 1С: от постановки до решения в рабочей базе
Содержание
Любую задачу в 1С решают в одном порядке: сначала ищут готовую настройку в пользовательском режиме, затем отчёт на СКД или внешнюю обработку , и только потом — доработку конфигурации, причём через расширение, а не правкой типового кода. Чем ниже по этой лестнице вы спускаетесь, тем дороже решение обходится при каждом обновлении.
Порядок общий для платформы 1С:Предприятие 8.3 и не зависит от конфигурации: БП 3.0, ЗУП 3.1 и УТ 11 дорабатывают одними и теми же инструментами. Разница только в именах объектов и регистров.
С чего начать решение задачи в 1С: тип задачи и уровень вмешательства
Пользователь формулирует задачу словами: «отчёт показывает не то», «нужна кнопка», «долго проводится». Первый шаг — перевести её в один из технических типов. От типа зависит инструмент.
| Тип задачи | Пример | Чем решать в первую очередь |
|---|---|---|
| 📊 Получить данные | «Нужна выборка продаж по менеджерам» | Настройка готового отчёта, затем внешний отчёт на СКД |
| 🧮 Массово изменить данные | «Проставить всем контрагентам вид» | Групповое изменение реквизитов, затем внешняя обработка |
| ⚙️ Изменить поведение | «Запретить проводить без договора» | Расширение конфигурации |
| 🖨️ Печатная форма | «Свой бланк счёта» | Внешняя печатная форма или расширение |
| 🐞 Ошибка | «Падает при записи документа» | Журнал регистрации, отладчик |
| 🐢 Скорость | «Отчёт строится 10 минут» | Замер производительности, технологический журнал |
| 🔄 Обновление и перенос | «Перейти на новый релиз, не потеряв доработки» | Сравнение и объединение, обмен данными |
Перед тем как открыть Конфигуратор , проверьте три вещи:
- Нет ли этого в типовом функционале. Многие «доработки» закрываются настройкой: варианты отчётов, дополнительные реквизиты и сведения, групповое изменение реквизитов.
- Как часто нужно решение. Разовую выгрузку проще сделать внешней обработкой, которую потом выбросят.
- Кто будет поддерживать результат. Изменение типового модуля ляжет на того, кто обновляет базу.
Попросите пользователя показать задачу на экране: какой документ, какое поле, какой итог он ожидает. Полчаса разговора часто убирают половину требований.
Как получить нужные данные: запросы в 1С
Почти каждая задача упирается в данные. В 1С их берут запросом, а не перебором справочников и документов в цикле.
Где писать и проверять запрос
- 🛠️ Конструктор запроса — в модуле Конфигуратора правая кнопка мыши →
Конструктор запроса. Удобно собирать соединения и группировки. - 🔍 Консоль запросов — внешняя обработка из набора инструментов разработчика. В ней запрос проверяют на живых данных, не меняя конфигурацию.
- 📑 Схема компоновки данных (СКД) — для отчётов. Запрос пишут в наборе данных, а группировки, отборы и оформление пользователь настраивает сам.
Пять правил хорошего запроса
- Параметры виртуальных таблиц, а не
ГДЕ. Отбор по складу в параметрахОстатки(&Дата, Склад = &Склад)отсекает данные до расчёта остатков. Условие вГДЕсрабатывает после — медленнее. - Временные таблицы. Сложную выборку дробите на шаги через
ПОМЕСТИТЬ. Каждый шаг легко проверить отдельно в консоли. - Никаких запросов в цикле. Собрали список ссылок — передайте его одним параметром и получите данные за один запрос.
- Осторожно с составными типами. Обращение через точку к реквизиту поля составного типа порождает соединение с каждой возможной таблицей. Помогает
ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты). - Выбирайте только нужные поля.
ВЫБРАТЬ *в отчётах и обработках не используют.
Пример запроса с временной таблицей и параметрами виртуальной таблицы. Имя регистра условное — подставьте регистр своей конфигурации:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Родитель В ИЕРАРХИИ(&Группа)
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &Дата,
| Склад = &Склад
| И Номенклатура В
| (ВЫБРАТЬ
| ВТ_Товары.Номенклатура
| ИЗ
| ВТ_Товары)) КАК Остатки";
Запрос.УстановитьПараметр("Группа", Группа);
Запрос.УстановитьПараметр("Дата", Новый Граница(ТекущаяДатаСеанса(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Номенклатура) + ": " + Формат(Выборка.Остаток, "ЧГ=0"));
КонецЦикла;
ТекущаяДатаСеанса() работает на сервере. Код с запросом держите в серверной процедуре или общем серверном модуле.
Логика решения задачи в модулях 1С
Когда данные получены, их нужно обработать: проверить, рассчитать, записать. Здесь важно понимать, где выполняется код.
Клиент и сервер
В управляемом приложении форма живёт на клиенте, а база — на сервере. Каждый вызов сервера из клиента — это обмен по сети. Отсюда главное правило: один вызов сервера на действие пользователя, а не по вызову на каждую строку таблицы.
&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
ЗаполнитьОстаткиНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьОстаткиНаСервере()
// Весь запрос и заполнение табличной части — здесь, за один вызов
Объект.Товары.Очистить();
// ... запрос, затем заполнение строк из выборки
КонецПроцедуры
Если серверной процедуре не нужны данные формы, используйте директиву &НаСервереБезКонтекста — тогда на сервер не передаётся вся форма, и вызов заметно легче.
Где размещать код
| Что нужно | Куда писать |
|---|---|
| Проверка перед записью документа | Модуль объекта, обработчик ОбработкаПроверкиЗаполнения или ПередЗаписью |
| Движения по регистрам | Модуль объекта, ОбработкаПроведения |
| Реакция на поле формы | Модуль формы, обработчик ПриИзменении элемента |
| Функция, нужная в разных местах | Общий модуль с нужными флагами (Сервер, Клиент, Вызов сервера) |
| Изменение типового поведения | Расширение: перехват метода аннотациями &Перед, &После или &Вместо |
Расширение вместо правки типовой
Расширения появились в платформе 8.3.6 и сегодня это основной способ доработки. Вы заимствуете объект из основной конфигурации, перехватываете нужную процедуру и пишете свой код. Типовая остаётся на поддержке, обновление ставится без ручного объединения.
Порядок работы:
Конфигурация → Расширения конфигурации→ добавить новое расширение.- В дереве основной конфигурации правой кнопкой по объекту →
Добавить в расширение. - В модуле заимствованного объекта по процедуре выбрать перехват (
&Перед,&После,&Вместо). - Обновить расширение
в базе (
F7) и проверить в пользовательском режиме.
Аннотация &Вместо полностью подменяет типовую процедуру. После обновления типовой конфигурации её логика может измениться, а ваш перехват — нет. Предпочитайте &Перед и &После, где это возможно.
Поиск причин ошибок: отладка в 1С
Ошибка — самая частая задача. Решают её от простого к сложному.
Шаг 1. Текст ошибки и журнал регистрации
Сначала получите точный текст. У пользователя на экране обычно сокращённая версия, полная — по ссылке «Подробнее» в окне ошибки. Там видно модуль, строку и стек вызовов.
Если пользователь закрыл окно, текст лежит в журнале регистрации. В БП 3.0 и ЗУП 3.1 он открывается через Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — Администрирование → Журнал регистрации. Отберите события по пользователю, времени и уровню «Ошибка».
Шаг 2. Отладчик
Повторите ошибку на копии базы под отладкой:
- В Конфигураторе
Отладка → Начать отладку(F5). - Поставьте точку останова в подозрительной строке —
F9. - Включите
Отладка → Остановка по ошибке, чтобы отладчик сам остановился в строке, где возникло исключение. - Значения переменных смотрите в окне
Таблоили вВычислить выражение(Shift+F9).
Для клиент-серверной базы на сервере 1С должна быть разрешена отладка. Сервер запускают с ключом -debug, иначе отладчик не подключится к серверному коду.
Перезапуск службы агента сервера 1С для включения отладки обрывает сеансы всех пользователей. Делайте это вне рабочего времени или на тестовом сервере.
Шаг 3. Технологический журнал
Если ошибка плавающая и не повторяется под отладчиком, включите технологический журнал. Он настраивается файлом logcfg.xml в каталоге conf платформы и пишет события сервера: исключения, блокировки, долгие запросы к СУБД.
Пример настройки, которая собирает исключения и события длиннее одной секунды:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\1C_TechLog" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<ge property="duration" value="10000"/>
</event>
<property name="all"/>
</log>
</config>
Журнал без отборов за час на нагруженном сервере может занять гигабайты. Ставьте history в часах и удаляйте logcfg.xml, как только собрали данные.
Как решать задачи производительности в 1С
Жалоба «тормозит» — это не задача, пока нет цифры. Сначала замерьте: какая операция, сколько секунд, у скольких пользователей.
Инструменты замера
- ⏱️ Замер производительности — в Конфигураторе
Отладка → Замер производительностипри запущенной отладке. Показывает, какие строки кода заняли больше всего времени и сколько раз выполнялись. - 📜 Технологический журнал — события
DBMSSQLилиDBPOSTGRSпоказывают долгие запросы к СУБД, событияTLOCKиTTIMEOUT— ожидания на блокировках. - 📈 Счётчики сервера — загрузка процессора и памяти рабочими процессами видна в консоли кластера.
Типовые причины медленной работы
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
| Замер показывает тысячи вызовов одной строки | Запрос или обращение через точку в цикле | Вынести в один запрос до цикла |
| Отчёт долго строится на большом периоде | Отбор в ГДЕ вместо параметров виртуальной таблицы | Перенести отбор в параметры |
| Документ долго проводится у нескольких человек одновременно | Ожидание на блокировках | Проверить управляемые блокировки, сузить область |
| Поиск по реквизиту медленный | Нет индекса | Свойство реквизита Индексировать |
| Всё стало медленнее за месяц | Разрослись регистры, нет пересчёта итогов | Пересчёт итогов, регламентное обслуживание СУБД |
Ускоряйте только то, что показал замер. Переписать «на всякий случай» кусок, который занимает 2% времени, бессмысленно: пользователь разницы не заметит.
Смотрите и на число вызовов сервера. В замере отладчика их видно отдельно. Форма, которая при открытии делает 40 серверных вызовов, будет медленной даже на быстром железе.
Обновление конфигурации и перенос данных без потери доработок
Последний тип задач — сохранить работу при обновлении и переносе. Здесь ошибка стоит дороже всего, поэтому порядок жёсткий.
Перед обновлением
- Сделайте выгрузку базы в .dt —
Администрирование → Выгрузить информационную базув Конфигураторе. Для клиент-серверной базы дополнительно — резервную копию средствами СУБД. - Проверьте, какие объекты сняты с поддержки или изменены:
Конфигурация → Поддержка → Настройка поддержки. - Убедитесь, что номер платформы не ниже требуемого для нового релиза.
Как обновлять
- Типовая на поддержке, доработки в расширениях —
Конфигурация → Поддержка → Обновить конфигурацию, затем обновление базы данных (F7). Расширения проверьте после обновления: для каждого перехваченного метода убедитесь, что он ещё существует. - Типовая с изменениями — обновление через сравнение и объединение. В окне сравнения проходите каждое отличие: оставить своё, взять из поставщика или объединить вручную.
Загрузка .dt и обновление структуры базы требуют монопольного доступа. Заранее завершите сеансы пользователей и предупредите их о времени работ.
Миграция данных
Перенос между разными конфигурациями (например, из старой УТ в новую) решают обменом, а не выгрузкой таблиц:
- 🔄 Встроенные обработки перехода — для типовых переходов (из БП 2.0 в 3.0 и т. п.) поставщик даёт готовый механизм.
- 🔗 Обмен через формат EnterpriseData — для синхронизации типовых конфигураций между собой через
Синхронизация данных. - 🛠️ Конвертация данных — когда конфигурации нетиповые и нужны свои правила сопоставления объектов.
Перед боевым переносом всегда делайте пробный на копиях и сверяйте остатки и обороты по ключевым счетам или регистрам. Расхождение на копии — это задача; расхождение в рабочей базе — уже авария.
Как оформить результат, чтобы задача не вернулась
Задача решена, когда она решена у пользователя и через полгода после обновления. Несколько привычек сильно сокращают число повторных обращений:
- 📝 Комментарий в коде — номер задачи и дата в начале доработанной процедуры. Через год это единственная подсказка, зачем она здесь.
- 🧪 Проверка на копии с реальными данными — пустая тестовая база скрывает ошибки, которые проявятся на 200 тысячах записей.
- 📦 Хранилище конфигурации или Git через EDT — если разработчиков больше одного. Иначе изменения одного затрут правки другого.
- ✅ Приёмка пользователем — пусть он сам проведёт документ или построит отчёт, а не просто кивнёт на скриншот.