Доработка обработки 1С: код, форма, запросы и отладка
Содержание
Чтобы изменить обработку в 1С, откройте её в Конфигураторе: внешнюю (файл .epf) — через Файл → Открыть, встроенную — в дереве конфигурации в ветке «Обработки». Дальше правите модуль, форму или текст запроса, проверяете синтаксис (Ctrl+F7), отлаживаете и сохраняете. Для типовой конфигурации на поддержке встроенную обработку правильнее менять через расширение, а не снимать конфигурацию с поддержки.
Ниже — порядок действий для программиста и опытного администратора 1С:Предприятия 8.3: от разбора чужой обработки до подключения новой версии в рабочей базе.
Что за обработка перед вами и каким способом её менять
Первый вопрос — где живёт обработка. От ответа зависит весь путь редактирования.
- 📄 Внешняя обработка — отдельный файл
.epf. Хранится на диске или загружена в справочник дополнительных обработок (в конфигурациях на БСП). Меняется без вмешательства в конфигурацию. - 🧩 Встроенная обработка — объект конфигурации. Если конфигурация типовая и стоит на поддержке, объект заблокирован для изменений.
- 🔌 Обработка из расширения — объект, добавленный расширением. Правится в окне расширения.
| Способ | Когда подходит | Риски |
|---|---|---|
Правка файла .epf | Внешние обработки и печатные формы | Нужно заново загрузить файл в базу |
| Расширение конфигурации | Встроенная обработка типовой конфигурации | После обновления типовой проверить, что заимствованные методы не изменились |
| Включение изменений на поддержке | Расширением задачу не решить | Обновления типовой становятся сложнее: каждое придётся сравнивать и объединять |
| Сохранение встроенной как внешней | Нужна своя копия для экспериментов | Типовая обработка остаётся прежней, пользователи работают с двумя версиями |
Расширения появились в платформе 8.3.6. На актуальных версиях платформы это основной способ дорабатывать типовые конфигурации без снятия с поддержки.
Подготовка: копия базы и разбор чужого кода
Обработку, которую писали не вы, не трогайте сразу в рабочей базе.
- Сделайте выгрузку: в Конфигураторе
Администрирование → Выгрузить информационную базу— получится файл.dt. - Разверните копию базы и подключите её в списке информационных баз под отдельным именем.
- Скопируйте исходный файл
.epfрядом с суффиксом версии, напримерZagruzkaCen_v1.epf. Если правка не взлетит, вернётесь к нему за минуту.
Загрузка .dt полностью заменяет данные базы — делайте это только в копии, не в рабочей.
Затем разберитесь, как устроена обработка. В дереве объекта посмотрите:
- 📌 Реквизиты — параметры, которые вводит пользователь (дата, организация, файл).
- 📋 Табличные части — списки строк, с которыми работает обработка.
- 🖼 Формы — какая из них основная (задаётся в свойствах объекта).
- ⚙️ Модуль объекта — серверная логика, общая для всех форм.
- 🗂 Макеты — печатные формы, шаблоны загрузки.
В конфигурациях на БСП у внешней обработки в модуле объекта есть функция СведенияОВнешнейОбработке(). Она описывает вид обработки, её команды и версию. Эту функцию вы будете менять в конце работы.
Если модуль защищён паролем, редактировать его нельзя — нужен исходник от автора.
Открываем обработку в Конфигураторе
Внешняя обработка
- Запустите Конфигуратор любой базы. Для внешней обработки подойдёт и пустая база с той же конфигурацией.
Файл → Открыть, выберите файл.epf.- Откроется окно объекта с деревом: реквизиты, табличные части, формы, макеты. Модули — через кнопки «Открыть модуль объекта» и в формах.
Если обработка загружена в справочник, сначала достаньте файл: в режиме 1С:Предприятие откройте Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, найдите обработку и выгрузите её в файл командой из карточки.
Встроенная обработка
Откройте Конфигурация → Открыть конфигурацию и найдите объект в ветке «Обработки». Если значок с замком — объект на поддержке, и правки недоступны.
Три варианта на этом шаге:
- Расширение.
Конфигурация → Расширения конфигурации, создайте расширение, затем в дереве основной конфигурации в контекстном меню обработки выберите «Добавить в расширение». Заимствуйте нужную форму или модуль. - Своя копия. В контекстном меню обработки есть команда «Сохранить как внешнюю обработку
, отчет». Получите
.epf, с которым можно работать как с обычной внешней обработкой. - Правка на поддержке.
Конфигурация → Поддержка → Настройка поддержки, включить возможность изменения и выставить правило для объекта. Решение, после которого каждое обновление типовой требует сравнения и объединения. Применяйте его, только если расширение не справляется.
Как изменить код обработки: модули объекта и формы
У управляемой формы два места для кода, и путать их нельзя.
| Модуль | Где выполняется | Что туда писать |
|---|---|---|
| Модуль формы | Клиент и сервер (по директивам) | Обработчики кнопок, событий формы, проверку ввода |
| Модуль объекта | Сервер | Основной алгоритм, работу с базой, функцию регистрации БСП |
В модуле формы каждая процедура помечается директивой: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Запрос к базе с клиента выполнить нельзя — для него нужна серверная процедура.
Типичная связка «кнопка → сервер» выглядит так:
&НаКлиенте
Процедура Заполнить(Команда)
Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
Сообщить("Выберите организацию");
Возврат;
КонецЕсли;
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьТовары();
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры
Здесь ЗаполнитьТовары() — экспортная процедура модуля объекта. Через РеквизитФормыВЗначение форма получает объект обработки, вызывает его метод и возвращает результат обратно на форму.
Правка встроенной обработки через расширение
В расширении копировать модуль целиком не нужно. Достаточно повесить свою процедуру до, после или вместо типовой:
&НаСервере
&После("ЗаполнитьНаСервере")
Процедура Расш1_ЗаполнитьНаСервере()
Для Каждого Строка Из Объект.Товары Цикл
Строка.Количество = Окр(Строка.Количество, 0);
КонецЦикла;
КонецПроцедуры
Аннотации &Перед, &После, &Вместо и &ИзменениеИКонтроль задают, как ваш код встраивается в типовой метод. &ИзменениеИКонтроль удобна для точечной вставки внутрь чужой процедуры: при обновлении типовой платформа сообщит, что исходный текст изменился.
После каждой правки — Ctrl+F7 (проверка синтаксиса модуля). Ошибки появятся в окне служебных сообщений с номером строки.
Форма обработки: реквизиты, элементы и кнопки
Форму открывают двойным щелчком в ветке «Формы». Редактор делится на вкладки: «Элементы», «Реквизиты», «Команды» и сам макет внизу.
Новое поле на форме
- На вкладке «Реквизиты» раскройте «Объект» — это реквизиты самой обработки. Новый реквизит обработки добавьте в дереве объекта, тогда он появится здесь.
- Перетащите реквизит мышью в дерево элементов, в нужную группу.
- В свойствах элемента задайте заголовок, вид поля и обработчики событий, например
ПриИзменении.
Реквизит только для формы (без хранения в объекте) добавляйте прямо на вкладке «Реквизиты» кнопкой добавления — он не попадёт в модуль объекта.
Новая кнопка
- На вкладке «Команды» добавьте команду и задайте ей действие — нажмите на лупу у свойства «Действие». Платформа создаст обработчик в модуле формы.
- Перетащите команду в командную панель формы или в группу элементов.
- Заполните обработчик кодом.
Группы «Обычная группа» с горизонтальной группировкой помогают уложить несколько полей в одну строку. Если поля «разъехались», проверьте свойство «Группировка» у родительской группы.
Запросы в обработке: читаем и меняем выборку
Большинство доработок обработок — это правка запроса: добавить отбор, поле, соединение.
- Поставьте курсор внутрь текста запроса в модуле.
- Правой кнопкой — «Конструктор запроса». Конструктор откроет существующий текст и разложит его по вкладкам: таблицы, поля, условия, соединения, группировки.
- Внесите изменения и нажмите «ОК» — текст в модуле перепишется.
Пример запроса с параметром, который заполняет табличную часть:
&НаСервере
Процедура ЗаполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И НЕ Номенклатура.ЭтоГруппа
| И Номенклатура.Родитель В ИЕРАРХИИ (&Группа)";
Запрос.УстановитьПараметр("Группа", Объект.ГруппаНоменклатуры);
Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Метод Загрузить переносит колонки по именам. Псевдонимы полей в запросе (КАК Номенклатура) должны совпадать с именами колонок табличной части Товары, иначе колонка останется пустой.
Что проверить при правке запроса:
- 🔍 Параметры. Каждый
&Параметрв тексте должен получить значение черезУстановитьПараметр, иначе запрос упадёт с ошибкой. - 🐢 Запрос в цикле. Если запрос выполняется для каждой строки, вынесите его наружу и получите данные одной выборкой — на тысяче строк разница в минутах.
- 🔗 Поля через точку. Обращение
Документ.Контрагент.ИННпорождает неявное соединение. Для больших таблиц лучше соединить явно.
Отладить сам текст запроса удобно в консоли запросов — это отдельная обработка, которая показывает результат и параметры. Скопируйте текст туда, задайте параметры и посмотрите, что возвращается, прежде чем вставлять в модуль.
Отладка и проверка изменённой обработки
Как отлаживать внешнюю обработку
- В Конфигураторе откройте тот же файл
.epf, который будете запускать. Отладчик сопоставляет обработку по пути к файлу. - Поставьте точку останова —
F9на нужной строке. - Запустите отладку:
Отладка → Начать отладку → 1С:Предприятие(илиF5). - В открывшемся сеансе откройте обработку через
Файл → Открытьи выберите тот же файл. - Нажмите кнопку на форме — выполнение остановится на точке.
Клавиши в отладке: F10 — шаг через, F11 — шаг внутрь процедуры, Shift+F11 — выход из процедуры. Значения переменных смотрите в окне «Табло» или наведением курсора.
Если обработка подключена из справочника дополнительных обработок, платформа запускает временную копию, а не ваш файл. Точки останова в файле на диске тогда не сработают — отлаживайте через Файл → Открыть.
В клиент-серверном варианте серверный код останавливается на точках только если на сервере 1С разрешена отладка (служба запускается с ключом -debug). Включать это на рабочем сервере без согласования не стоит: изменение параметров службы требует её перезапуска, а при перезапуске оборвутся все сеансы пользователей. Делайте это в нерабочее время или на тестовом сервере.
Что прогнать перед выпуском
Сохраняем изменения и подключаем обработку в базе
Внешняя обработка
Файл → Сохранить(Ctrl+S). Файл.epfперезапишется.- Если обработка запускается через
Файл → Открыть— просто откройте файл заново в 1С:Предприятии. Ранее открытую форму закройте. - Если обработка загружена в справочник: откройте
Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, затем карточку обработки, загрузите обновлённый файл командой загрузки из файла и запишите карточку.
Перед загрузкой в справочник поднимите версию в функции регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.2";
// команды обработки
Возврат ПараметрыРегистрации;
КонецФункции
По номеру версии в карточке видно, какая редакция сейчас в базе. Это сильно помогает, когда обработку правят несколько человек.
Встроенная обработка и расширение
- Изменения в основной конфигурации:
Конфигурация → Сохранить конфигурацию, затемКонфигурация → Обновить конфигурацию базы данных(F7). Если обновление затрагивает структуру базы, Конфигуратор потребует монопольный доступ — пользователей придётся отключить. - Расширение: в окне расширения сохраните его и обновите конфигурацию базы данных для расширения. Пользователи увидят изменения после перезапуска своего сеанса.
Правка только модуля или формы обработки обычно не меняет структуру данных. Новый реквизит у объекта, хранящегося в базе, — меняет. У обработки реквизиты не хранятся в таблицах, поэтому её доработка редко требует выгонять пользователей.