1C-CodeОсновы 1С → Обработки и отчёты: внешние и встроенные

Обработки и отчёты: внешние и встроенные

Два инструмента, которыми делают почти всю несрочную работу. Чем отличаются, когда какой брать и почему внешние любят на боевых базах.

Глава 32 из 36 · чтение примерно 22 минут

Половина задач разработчика не требует менять конфигурацию вовсе. «Загрузить прайс из Excel», «найти документы с пустым складом», «пересчитать себестоимость за март» — это обработки.

А «показать продажи по менеджерам» — отчёт.

Обработка и отчёт: в чём разница

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

Отчёт показывает данные и ничего не меняет. У него есть основная схема компоновки, механизм вариантов, сохранение настроек пользователя — всё это платформа даёт отчётам и не даёт обработкам.

Обработка делает что-то с данными. Загружает, исправляет, пересчитывает, выгружает.

Отсюда правило: если ничего не меняется — это отчёт. Сделать отчёт обработкой значит отказаться от вариантов и настроек, которые пришлось бы писать самому.

Что обязана уметь любая обработка, меняющая данные

Обработка — это код, запущенный руками на боевой базе. Отличается он от остального кода одним: за ним никто не следит, а данные он меняет по-настоящему. Поэтому к нему четыре требования, и все четыре — из опыта, а не из вкуса.

Сначала показать, потом делать. Обработка, которая сразу правит тысячу документов, — это выстрел вслепую. Правильная сначала собирает список «вот что я изменю» и показывает его человеку.

Уметь остановиться. Обработка на сорок минут обязана показывать, где она сейчас, и позволять прервать себя. Иначе её прервут выключением, и как раз посередине.

Переживать повторный запуск. Прервалась на середине — второй запуск должен доделать, а не испортить сделанное. Это то же требование, что и к обмену, и по той же причине.

Оставлять след. Что изменено, сколько, когда и кем. Через месяц спросят «а откуда эта сумма» — и ответить будет нечем, если след не остался.

Обработка на боевой базе — это операция, а не запуск

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

«Я проверил на тестовой» — не то же самое: на тестовой обычно нет ни объёма, ни грязных данных, ни тех самых десяти документов с пустым складом, на которых всё и сломается.

И отдельно: обработку, меняющую данные, не запускают в рабочее время, если она берёт блокировки надолго. Для человека за кассой это выглядит как «база зависла».

Встроенная или внешняя

Встроенная живёт в конфигурации. Её видно в дереве, она попадает в обновление, ей доступно всё.

Внешняя — отдельный файл .epf (обработка) или .erf (отчёт). Конфигурацию не трогает вовсе, открывается через меню «Файл — Открыть» или подключается механизмом дополнительных обработок БСП.

Почему внешние любят на боевых базах

Не требуют снятия с поддержки. Конфигурация остаётся типовой целиком.

Не требуют монопольного режима. Изменение конфигурации на боевой базе — это обычно всех выгнать и ждать. Внешнюю обработку подключают на работающей базе.

Можно передать файлом. Разовая задача от клиента решается отправкой одного файла.

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

Дополнительные обработки БСП

Класть .epf в папку и просить пользователя открывать его через меню — плохо: файл потеряется, версии разойдутся, права не проверятся.

В БСП есть механизм дополнительных отчётов и обработок: файл загружают в справочник, указывают, к каким объектам он относится и кому доступен. После этого он появляется в меню нужных документов как обычная команда.

Для этого в обработке описывают сведения о внешней обработке — экспортную функцию, которая возвращает её вид, назначение и список команд.

Как отдать результат человеку

Обработка что-то посчитала. Дальше это надо показать, и способов ровно четыре — по тому, что человек будет с этим делать.

Табличный документ — когда смотрят и печатают. Это родной формат 1С: макет, области, итоги, печать. Из него же человек сам сохранит в Excel или PDF, и делать это за него не надо.

Таблица на форме — когда с результатом будут работать: отмечать галочками, сортировать, выбирать строки и нажимать «сделать с отмеченными». Половина обработок именно такая: показали список, человек отметил, обработка сделала.

Файл — когда результат уедет в чужую систему. Тут важно помнить про клиента и сервер: файл собирают на сервере, а сохраняют на диск человека — с клиента, и только через механизм помещения файлов.

Сообщения — только для коротких пояснений и ошибок. Вываливать в сообщения отчёт на двести строк нельзя: их не отсортировать, не сохранить и не найти в них ничего.

Сообщение, привязанное к строке

У сообщения есть ключ: можно указать, к какой строке какого объекта оно относится. Тогда человек щёлкает по нему и попадает прямо в ту строку того документа.

Разница между «в 14 документах пустой склад» и списком, по которому можно кликнуть, — это разница между «мне сказали о проблеме» и «я могу её починить».

Печатная форма: макет и табличный документ

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

Макет — это заготовка в виде таблицы, разбитая на именованные области: «Шапка», «Строка», «Подвал». В ячейках стоят параметры — <Номенклатура>, — которые заполняются из данных.

Табличный документ — то, во что макет выводится. Области берут по имени, заполняют параметры и выводят по очереди; строки табличной части — в цикле.

Печатная форма по областям

Макет = ПолучитьМакет("Печать");
Таб = Новый ТабличныйДокумент;

Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Номер = Ссылка.Номер;
Таб.Вывести(Область);

ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого Строка Из Ссылка.Товары Цикл
	ОбластьСтроки.Параметры.Заполнить(Строка);
	Таб.Вывести(ОбластьСтроки);
КонецЦикла;
ЧастьЧто означает
ПолучитьМакетмакет лежит внутри обработки или объекта и берётся по имени
ПолучитьОбластькусок макета: шапка, строка таблицы, подвал
Параметры.Заполнитьзаполняет параметры области одноимёнными полями структуры или строки
Вывестидописывает область в конец табличного документа — порядок вывода и есть порядок на бумаге

Печать пачкой и повторное чтение

Печатная форма, написанная «на один документ», при печати пачки из ста документов читает каждый по очереди — сто чтений объекта.

Поэтому в типовых печать устроена иначе: процедура получает массив ссылок и делает ОДИН запрос по всем, а потом выводит области по строкам результата.

Это тот же приём «запрос до цикла», только применённый к печати. И он же объясняет, почему у типовых печатных форм такая громоздкая сигнатура с массивом и объектом настроек.

Команды, подсистемы и «где эта кнопка»

Обработка написана, а как человек её откроет?

Команда — то, что становится кнопкой. У обработки есть свои команды, и у каждой указано, где её показывать: в форме объекта, в списке, в панели.

Подсистема — раздел интерфейса, в котором объект вообще виден. Не включили обработку ни в одну подсистему — её не будет в интерфейсе, сколько команд ни пиши. Это и есть ответ на «сделал, а нигде не видно».

А ещё видимость команд зависит от прав роли и от функциональных опций: то, что видно вам под полными правами, может не существовать для кладовщика.

Обработка по расписанию

«Каждую ночь выгружать остатки» — это не обработка с кнопкой, а регламентное задание.

Устроено оно просто: в конфигурации заводится регламентное задание с расписанием, у него есть имя метода — процедуры в общем модуле, которую платформа вызовет сама.

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

Отладка внешней обработки

Внешняя обработка отлаживается так же, как всё остальное, но с двумя оговорками, из-за которых говорят «точки не срабатывают».

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

Второе: если обработка подключена через справочник дополнительных обработок, в базе лежит её копия, сохранённая при подключении. Правка файла на диске ничего не меняет, пока не обновишь её в справочнике.

Отчёт на СКД или обработка с запросом

Вопрос, который встаёт в каждой второй задаче «сделайте отчёт». Разница не в сложности, а в том, кто будет его менять дальше.

СКД — когда результат будут крутить: менять группировки, добавлять отборы, выводить в другом порядке, сохранять свои варианты. Всё это пользователь делает сам, без вас. Цена — разобраться в схеме и настройках.

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

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

На чём спотыкаются

Делают отчёт обработкой. Потом пишут вручную отборы, сортировку и сохранение настроек — то есть заново делают то, что платформа даёт отчёту бесплатно.

Пишут обработку, которая молча меняет данные. Любая обработка, что-то исправляющая, обязана сначала ПОКАЗАТЬ, что собирается сделать, и только потом делать. Кнопка «Проверить» до кнопки «Исправить».

Не пишут журнал. Обработка прошла по десяти тысячам документов — что именно она изменила, потом не выяснить. Результат надо выводить списком.

Забывают про монопольный режим. Массовое изменение на работающей базе конфликтует с людьми, которые в этот момент проводят документы.

Упражнение 1. Отчёт или обработка

Функция ЧтоДелать(Задача) возвращает «Отчёт», если задача только показывает данные, и «Обработка», если что-то меняет. Признак изменения: в описании есть загруз, исправ или пересчит.

Решается в тренажёре: код запускается и проверяется сразу.

Упражнение 2. Прервали на середине

Обработка обрабатывает документы по списку и складывает обработанные в отдельный список. Её прервали и запустили заново. Функция ОсталосьСделать(Всего, Сделано) получает два числа и должна вернуть, сколько документов осталось. Если «сделано» почему-то больше, чем «всего», — вернуть 0, а не отрицательное число.

Решается в тренажёре: код запускается и проверяется сразу.

Короткий свод

Отчёт показывает, обработка меняет. Если ничего не меняется — это отчёт, и вариантов с настройками не придётся писать самому. Внешние не требуют снятия с поддержки и монопольного режима, поэтому ими решают разовое и срочное; постоянное встраивают. Подключать внешние правильно через механизм дополнительных обработок, а не раздачей файлов. Меняющая обработка сначала показывает, что сделает, и всегда пишет журнал.

Как закрепить

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

Открыть эту главу в тренажёре

Поддержка, обновление и расширения
Обмен данными и интеграции