1C-Code → Основы 1С → Обработки и отчёты: внешние и встроенные
Два инструмента, которыми делают почти всю несрочную работу. Чем отличаются, когда какой брать и почему внешние любят на боевых базах.
Глава 32 из 36 · чтение примерно 22 минут
Половина задач разработчика не требует менять конфигурацию вовсе. «Загрузить прайс из Excel», «найти документы с пустым складом», «пересчитать себестоимость за март» — это обработки.
А «показать продажи по менеджерам» — отчёт.
Формально — почти ни в чём: оба объекта конфигурации, у обоих есть формы, модуль и макеты. Разница в назначении, и она важна для того, кто будет читать вашу конфигурацию после вас.
Отчёт показывает данные и ничего не меняет. У него есть основная схема компоновки, механизм вариантов, сохранение настроек пользователя — всё это платформа даёт отчётам и не даёт обработкам.
Обработка делает что-то с данными. Загружает, исправляет, пересчитывает, выгружает.
Отсюда правило: если ничего не меняется — это отчёт. Сделать отчёт обработкой значит отказаться от вариантов и настроек, которые пришлось бы писать самому.
Обработка — это код, запущенный руками на боевой базе. Отличается он от остального кода одним: за ним никто не следит, а данные он меняет по-настоящему. Поэтому к нему четыре требования, и все четыре — из опыта, а не из вкуса.
Сначала показать, потом делать. Обработка, которая сразу правит тысячу документов, — это выстрел вслепую. Правильная сначала собирает список «вот что я изменю» и показывает его человеку.
Уметь остановиться. Обработка на сорок минут обязана показывать, где она сейчас, и позволять прервать себя. Иначе её прервут выключением, и как раз посередине.
Переживать повторный запуск. Прервалась на середине — второй запуск должен доделать, а не испортить сделанное. Это то же требование, что и к обмену, и по той же причине.
Оставлять след. Что изменено, сколько, когда и кем. Через месяц спросят «а откуда эта сумма» — и ответить будет нечем, если след не остался.
Обработка на боевой базе — это операция, а не запуск
Перед тем как нажать «Выполнить» на настоящих данных, делают три вещи: копию базы, прогон на этой копии и просмотр того, что получилось.
«Я проверил на тестовой» — не то же самое: на тестовой обычно нет ни объёма, ни грязных данных, ни тех самых десяти документов с пустым складом, на которых всё и сломается.
И отдельно: обработку, меняющую данные, не запускают в рабочее время, если она берёт блокировки надолго. Для человека за кассой это выглядит как «база зависла».
Встроенная живёт в конфигурации. Её видно в дереве, она попадает в обновление, ей доступно всё.
Внешняя — отдельный файл .epf (обработка) или .erf (отчёт). Конфигурацию не трогает вовсе, открывается через меню «Файл — Открыть» или подключается механизмом дополнительных обработок БСП.
Почему внешние любят на боевых базах
Не требуют снятия с поддержки. Конфигурация остаётся типовой целиком.
Не требуют монопольного режима. Изменение конфигурации на боевой базе — это обычно всех выгнать и ждать. Внешнюю обработку подключают на работающей базе.
Можно передать файлом. Разовая задача от клиента решается отправкой одного файла.
Цена: файл легко потерять и легко забыть, что он вообще где-то запускается. Поэтому то, что нужно постоянно, встраивают, а внешними держат разовое и срочное.
Класть .epf в папку и просить пользователя открывать его через меню — плохо: файл потеряется, версии разойдутся, права не проверятся.
В БСП есть механизм дополнительных отчётов и обработок: файл загружают в справочник, указывают, к каким объектам он относится и кому доступен. После этого он появляется в меню нужных документов как обычная команда.
Для этого в обработке описывают сведения о внешней обработке — экспортную функцию, которая возвращает её вид, назначение и список команд.
Обработка что-то посчитала. Дальше это надо показать, и способов ровно четыре — по тому, что человек будет с этим делать.
Табличный документ — когда смотрят и печатают. Это родной формат 1С: макет, области, итоги, печать. Из него же человек сам сохранит в Excel или PDF, и делать это за него не надо.
Таблица на форме — когда с результатом будут работать: отмечать галочками, сортировать, выбирать строки и нажимать «сделать с отмеченными». Половина обработок именно такая: показали список, человек отметил, обработка сделала.
Файл — когда результат уедет в чужую систему. Тут важно помнить про клиента и сервер: файл собирают на сервере, а сохраняют на диск человека — с клиента, и только через механизм помещения файлов.
Сообщения — только для коротких пояснений и ошибок. Вываливать в сообщения отчёт на двести строк нельзя: их не отсортировать, не сохранить и не найти в них ничего.
Сообщение, привязанное к строке
У сообщения есть ключ: можно указать, к какой строке какого объекта оно относится. Тогда человек щёлкает по нему и попадает прямо в ту строку того документа.
Разница между «в 14 документах пустой склад» и списком, по которому можно кликнуть, — это разница между «мне сказали о проблеме» и «я могу её починить».
Почти любая обработка рано или поздно должна что-то напечатать, и делается это не строками текста, а макетом.
Макет — это заготовка в виде таблицы, разбитая на именованные области: «Шапка», «Строка», «Подвал». В ячейках стоят параметры — <Номенклатура>, — которые заполняются из данных.
Табличный документ — то, во что макет выводится. Области берут по имени, заполняют параметры и выводят по очереди; строки табличной части — в цикле.
Макет = ПолучитьМакет("Печать");
Таб = Новый ТабличныйДокумент;
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Номер = Ссылка.Номер;
Таб.Вывести(Область);
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого Строка Из Ссылка.Товары Цикл
ОбластьСтроки.Параметры.Заполнить(Строка);
Таб.Вывести(ОбластьСтроки);
КонецЦикла;
| Часть | Что означает |
|---|---|
ПолучитьМакет | макет лежит внутри обработки или объекта и берётся по имени |
ПолучитьОбласть | кусок макета: шапка, строка таблицы, подвал |
Параметры.Заполнить | заполняет параметры области одноимёнными полями структуры или строки |
Вывести | дописывает область в конец табличного документа — порядок вывода и есть порядок на бумаге |
Печать пачкой и повторное чтение
Печатная форма, написанная «на один документ», при печати пачки из ста документов читает каждый по очереди — сто чтений объекта.
Поэтому в типовых печать устроена иначе: процедура получает массив ссылок и делает ОДИН запрос по всем, а потом выводит области по строкам результата.
Это тот же приём «запрос до цикла», только применённый к печати. И он же объясняет, почему у типовых печатных форм такая громоздкая сигнатура с массивом и объектом настроек.
Обработка написана, а как человек её откроет?
Команда — то, что становится кнопкой. У обработки есть свои команды, и у каждой указано, где её показывать: в форме объекта, в списке, в панели.
Подсистема — раздел интерфейса, в котором объект вообще виден. Не включили обработку ни в одну подсистему — её не будет в интерфейсе, сколько команд ни пиши. Это и есть ответ на «сделал, а нигде не видно».
А ещё видимость команд зависит от прав роли и от функциональных опций: то, что видно вам под полными правами, может не существовать для кладовщика.
«Каждую ночь выгружать остатки» — это не обработка с кнопкой, а регламентное задание.
Устроено оно просто: в конфигурации заводится регламентное задание с расписанием, у него есть имя метода — процедуры в общем модуле, которую платформа вызовет сама.
Два практических факта, которые узнают не сразу. В файловой базе регламентные задания не работают сами — нужен запущенный клиент. Задание выполняется на сервере без человека: диалоги, файлы на клиенте и Сообщить там бессмысленны, а ошибки надо писать в журнал регистрации — иначе их никто не увидит.
Отладка внешней обработки
Внешняя обработка отлаживается так же, как всё остальное, но с двумя оговорками, из-за которых говорят «точки не срабатывают».
Первое: отлаживать надо тот же файл, который открыт в предприятии. Открыли копию из другой папки — точки стоят в ней, а выполняется другая.
Второе: если обработка подключена через справочник дополнительных обработок, в базе лежит её копия, сохранённая при подключении. Правка файла на диске ничего не меняет, пока не обновишь её в справочнике.
Вопрос, который встаёт в каждой второй задаче «сделайте отчёт». Разница не в сложности, а в том, кто будет его менять дальше.
СКД — когда результат будут крутить: менять группировки, добавлять отборы, выводить в другом порядке, сохранять свои варианты. Всё это пользователь делает сам, без вас. Цена — разобраться в схеме и настройках.
Обработка с запросом и табличным документом — когда форма результата задана жёстко: акт сверки, платёжное поручение, печатная форма по образцу из бухгалтерии. Крутить там нечего, а выглядеть должно ровно так.
Ошибаются обычно в одну сторону: делают жёсткий отчёт там, где через неделю попросят «а можно ещё по складам». Признак, что нужна СКД, — слова «а ещё хотелось бы видеть» в разговоре о задаче.
На чём спотыкаются
Делают отчёт обработкой. Потом пишут вручную отборы, сортировку и сохранение настроек — то есть заново делают то, что платформа даёт отчёту бесплатно.
Пишут обработку, которая молча меняет данные. Любая обработка, что-то исправляющая, обязана сначала ПОКАЗАТЬ, что собирается сделать, и только потом делать. Кнопка «Проверить» до кнопки «Исправить».
Не пишут журнал. Обработка прошла по десяти тысячам документов — что именно она изменила, потом не выяснить. Результат надо выводить списком.
Забывают про монопольный режим. Массовое изменение на работающей базе конфликтует с людьми, которые в этот момент проводят документы.
Упражнение 1. Отчёт или обработка
Функция ЧтоДелать(Задача) возвращает «Отчёт», если задача только показывает данные, и «Обработка», если что-то меняет. Признак изменения: в описании есть загруз, исправ или пересчит.
Решается в тренажёре: код запускается и проверяется сразу.
Упражнение 2. Прервали на середине
Обработка обрабатывает документы по списку и складывает обработанные в отдельный список. Её прервали и запустили заново. Функция ОсталосьСделать(Всего, Сделано) получает два числа и должна вернуть, сколько документов осталось. Если «сделано» почему-то больше, чем «всего», — вернуть 0, а не отрицательное число.
Решается в тренажёре: код запускается и проверяется сразу.
Отчёт показывает, обработка меняет. Если ничего не меняется — это отчёт, и вариантов с настройками не придётся писать самому. Внешние не требуют снятия с поддержки и монопольного режима, поэтому ими решают разовое и срочное; постоянное встраивают. Подключать внешние правильно через механизм дополнительных обработок, а не раздачей файлов. Меняющая обработка сначала показывает, что сделает, и всегда пишет журнал.
Читать про код и писать код — разные умения. В тренажёре к этой главе идут упражнения: вы пишете решение, оно запускается на настоящем интерпретаторе 1С и проверяется сразу, без установки платформы.
← Поддержка, обновление и расширения
→ Обмен данными и интеграции