Задача от пользователя 1С: от постановки до решения в рабочей базе

· 11 мин

Содержание

Любую задачу в 1С решают в одном порядке: сначала ищут готовую настройку в пользовательском режиме, затем отчёт на СКД или внешнюю обработку , и только потом — доработку конфигурации, причём через расширение, а не правкой типового кода. Чем ниже по этой лестнице вы спускаетесь, тем дороже решение обходится при каждом обновлении.

Порядок общий для платформы 1С:Предприятие 8.3 и не зависит от конфигурации: БП 3.0, ЗУП 3.1 и УТ 11 дорабатывают одними и теми же инструментами. Разница только в именах объектов и регистров.

С чего начать решение задачи в 1С: тип задачи и уровень вмешательства

Пользователь формулирует задачу словами: «отчёт показывает не то», «нужна кнопка», «долго проводится». Первый шаг — перевести её в один из технических типов. От типа зависит инструмент.

Тип задачиПримерЧем решать в первую очередь
📊 Получить данные«Нужна выборка продаж по менеджерам»Настройка готового отчёта, затем внешний отчёт на СКД
🧮 Массово изменить данные«Проставить всем контрагентам вид»Групповое изменение реквизитов, затем внешняя обработка
⚙️ Изменить поведение«Запретить проводить без договора»Расширение конфигурации
🖨️ Печатная форма«Свой бланк счёта»Внешняя печатная форма или расширение
🐞 Ошибка«Падает при записи документа»Журнал регистрации, отладчик
🐢 Скорость«Отчёт строится 10 минут»Замер производительности, технологический журнал
🔄 Обновление и перенос«Перейти на новый релиз, не потеряв доработки»Сравнение и объединение, обмен данными

Перед тем как открыть Конфигуратор , проверьте три вещи:

  1. Нет ли этого в типовом функционале. Многие «доработки» закрываются настройкой: варианты отчётов, дополнительные реквизиты и сведения, групповое изменение реквизитов.
  2. Как часто нужно решение. Разовую выгрузку проще сделать внешней обработкой, которую потом выбросят.
  3. Кто будет поддерживать результат. Изменение типового модуля ляжет на того, кто обновляет базу.

Попросите пользователя показать задачу на экране: какой документ, какое поле, какой итог он ожидает. Полчаса разговора часто убирают половину требований.

Какое решение выбрать для задачи?

Как получить нужные данные: запросы в 1С

Почти каждая задача упирается в данные. В 1С их берут запросом, а не перебором справочников и документов в цикле.

Где писать и проверять запрос

  • 🛠️ Конструктор запроса — в модуле Конфигуратора правая кнопка мыши → Конструктор запроса. Удобно собирать соединения и группировки.
  • 🔍 Консоль запросов — внешняя обработка из набора инструментов разработчика. В ней запрос проверяют на живых данных, не меняя конфигурацию.
  • 📑 Схема компоновки данных (СКД) — для отчётов. Запрос пишут в наборе данных, а группировки, отборы и оформление пользователь настраивает сам.

Пять правил хорошего запроса

  1. Параметры виртуальных таблиц, а не ГДЕ. Отбор по складу в параметрах Остатки(&Дата, Склад = &Склад) отсекает данные до расчёта остатков. Условие в ГДЕ срабатывает после — медленнее.
  2. Временные таблицы. Сложную выборку дробите на шаги через ПОМЕСТИТЬ. Каждый шаг легко проверить отдельно в консоли.
  3. Никаких запросов в цикле. Собрали список ссылок — передайте его одним параметром и получите данные за один запрос.
  4. Осторожно с составными типами. Обращение через точку к реквизиту поля составного типа порождает соединение с каждой возможной таблицей. Помогает ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты).
  5. Выбирайте только нужные поля. ВЫБРАТЬ * в отчётах и обработках не используют.

Пример запроса с временной таблицей и параметрами виртуальной таблицы. Имя регистра условное — подставьте регистр своей конфигурации:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|	Номенклатура.Родитель В ИЕРАРХИИ(&Группа)
|
|ИНДЕКСИРОВАТЬ ПО
|	Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	Остатки.Номенклатура КАК Номенклатура,
|	Остатки.КоличествоОстаток КАК Остаток
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(
|			&Дата,
|			Склад = &Склад
|				И Номенклатура В
|					(ВЫБРАТЬ
|						ВТ_Товары.Номенклатура
|					ИЗ
|						ВТ_Товары)) КАК Остатки";

Запрос.УстановитьПараметр("Группа", Группа);
Запрос.УстановитьПараметр("Дата", Новый Граница(ТекущаяДатаСеанса(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Строка(Выборка.Номенклатура) + ": " + Формат(Выборка.Остаток, "ЧГ=0"));
КонецЦикла;

ТекущаяДатаСеанса() работает на сервере. Код с запросом держите в серверной процедуре или общем серверном модуле.

Логика решения задачи в модулях 1С

Когда данные получены, их нужно обработать: проверить, рассчитать, записать. Здесь важно понимать, где выполняется код.

Клиент и сервер

В управляемом приложении форма живёт на клиенте, а база — на сервере. Каждый вызов сервера из клиента — это обмен по сети. Отсюда главное правило: один вызов сервера на действие пользователя, а не по вызову на каждую строку таблицы.

&НаКлиенте
Процедура ЗаполнитьОстатки(Команда)
	ЗаполнитьОстаткиНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьОстаткиНаСервере()
	// Весь запрос и заполнение табличной части — здесь, за один вызов
	Объект.Товары.Очистить();
	// ... запрос, затем заполнение строк из выборки
КонецПроцедуры

Если серверной процедуре не нужны данные формы, используйте директиву &НаСервереБезКонтекста — тогда на сервер не передаётся вся форма, и вызов заметно легче.

Где размещать код

Что нужноКуда писать
Проверка перед записью документаМодуль объекта, обработчик ОбработкаПроверкиЗаполнения или ПередЗаписью
Движения по регистрамМодуль объекта, ОбработкаПроведения
Реакция на поле формыМодуль формы, обработчик ПриИзменении элемента
Функция, нужная в разных местахОбщий модуль с нужными флагами (Сервер, Клиент, Вызов сервера)
Изменение типового поведенияРасширение: перехват метода аннотациями &Перед, &После или &Вместо

Расширение вместо правки типовой

Расширения появились в платформе 8.3.6 и сегодня это основной способ доработки. Вы заимствуете объект из основной конфигурации, перехватываете нужную процедуру и пишете свой код. Типовая остаётся на поддержке, обновление ставится без ручного объединения.

Порядок работы:

  1. Конфигурация → Расширения конфигурации → добавить новое расширение.
  2. В дереве основной конфигурации правой кнопкой по объекту → Добавить в расширение.
  3. В модуле заимствованного объекта по процедуре выбрать перехват (&Перед, &После, &Вместо).
  4. Обновить расширение в базе (F7) и проверить в пользовательском режиме.

Аннотация &Вместо полностью подменяет типовую процедуру. После обновления типовой конфигурации её логика может измениться, а ваш перехват — нет. Предпочитайте &Перед и &После, где это возможно.

Поиск причин ошибок: отладка в 1С

Ошибка — самая частая задача. Решают её от простого к сложному.

Шаг 1. Текст ошибки и журнал регистрации

Сначала получите точный текст. У пользователя на экране обычно сокращённая версия, полная — по ссылке «Подробнее» в окне ошибки. Там видно модуль, строку и стек вызовов.

Если пользователь закрыл окно, текст лежит в журнале регистрации. В БП 3.0 и ЗУП 3.1 он открывается через Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — Администрирование → Журнал регистрации. Отберите события по пользователю, времени и уровню «Ошибка».

Шаг 2. Отладчик

Повторите ошибку на копии базы под отладкой:

  1. В Конфигураторе Отладка → Начать отладку (F5).
  2. Поставьте точку останова в подозрительной строке — F9.
  3. Включите Отладка → Остановка по ошибке, чтобы отладчик сам остановился в строке, где возникло исключение.
  4. Значения переменных смотрите в окне Табло или в Вычислить выражение (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 серверных вызовов, будет медленной даже на быстром железе.

Обновление конфигурации и перенос данных без потери доработок

Последний тип задач — сохранить работу при обновлении и переносе. Здесь ошибка стоит дороже всего, поэтому порядок жёсткий.

Перед обновлением

  1. Сделайте выгрузку базы в .dt — Администрирование → Выгрузить информационную базу в Конфигураторе. Для клиент-серверной базы дополнительно — резервную копию средствами СУБД.
  2. Проверьте, какие объекты сняты с поддержки или изменены: Конфигурация → Поддержка → Настройка поддержки.
  3. Убедитесь, что номер платформы не ниже требуемого для нового релиза.

Как обновлять

  • Типовая на поддержке, доработки в расширениях — Конфигурация → Поддержка → Обновить конфигурацию, затем обновление базы данных (F7). Расширения проверьте после обновления: для каждого перехваченного метода убедитесь, что он ещё существует.
  • Типовая с изменениями — обновление через сравнение и объединение. В окне сравнения проходите каждое отличие: оставить своё, взять из поставщика или объединить вручную.

Загрузка .dt и обновление структуры базы требуют монопольного доступа. Заранее завершите сеансы пользователей и предупредите их о времени работ.

Миграция данных

Перенос между разными конфигурациями (например, из старой УТ в новую) решают обменом, а не выгрузкой таблиц:

  • 🔄 Встроенные обработки перехода — для типовых переходов (из БП 2.0 в 3.0 и т. п.) поставщик даёт готовый механизм.
  • 🔗 Обмен через формат EnterpriseData — для синхронизации типовых конфигураций между собой через Синхронизация данных.
  • 🛠️ Конвертация данных — когда конфигурации нетиповые и нужны свои правила сопоставления объектов.

Перед боевым переносом всегда делайте пробный на копиях и сверяйте остатки и обороты по ключевым счетам или регистрам. Расхождение на копии — это задача; расхождение в рабочей базе — уже авария.

Как оформить результат, чтобы задача не вернулась

Задача решена, когда она решена у пользователя и через полгода после обновления. Несколько привычек сильно сокращают число повторных обращений:

  • 📝 Комментарий в коде — номер задачи и дата в начале доработанной процедуры. Через год это единственная подсказка, зачем она здесь.
  • 🧪 Проверка на копии с реальными данными — пустая тестовая база скрывает ошибки, которые проявятся на 200 тысячах записей.
  • 📦 Хранилище конфигурации или Git через EDT — если разработчиков больше одного. Иначе изменения одного затрут правки другого.
  • ✅ Приёмка пользователем — пусть он сам проведёт документ или построит отчёт, а не просто кивнёт на скриншот.
Перед переносом доработки в рабочую базу
Выполнено: 0 / 5

Частые вопросы

Чем внешняя обработка отличается от расширения?
Внешняя обработка — отдельный файл .epf, который запускают вручную, когда он нужен. Расширение встроено в базу и меняет её поведение постоянно: формы, проверки, проведение.
Можно ли решать задачи в 1С без Конфигуратора?
Да, многие — через настройки отчётов, дополнительные реквизиты, групповое изменение и подключение внешних отчётов и обработок в пользовательском режиме. Конфигуратор нужен, когда меняется логика программы.
Почему код работает в файловой базе, а на сервере падает?
В файловом режиме клиент и сервер выполняются в одном процессе, и ошибка в директивах компиляции не всегда видна. На сервере 1С вызов серверного метода из клиентского кода без нужной директивы сразу даёт ошибку.
Что выбрать для разработки: Конфигуратор или EDT?
Конфигуратор быстрее для мелких правок одной базы. EDT удобнее при командной работе и хранении кода в Git, но требует больше ресурсов компьютера.
Как понять, что задача уже решена в новом релизе?
Прочитайте описание изменений релиза перед доработкой. Часто то, что просит пользователь, поставщик уже добавил, и достаточно обновиться.