При разработке внешних обработок заполнения табличных частей для конфигураций на платформе 1С:Предприятие 8.3 (особенно использующих Библиотеку стандартных подсистем — БСП, таких как «1С:Розница 2.2», «1С:Управление торговлей» и другие) разработчики часто сталкиваются с ситуацией, когда обработка успешно регистрируется в системе, но заветная кнопка на форме документа так и не появляется.
В этой статье мы подробно разберем, почему может возникать подобная проблема, проанализируем исходный код регистрации, выясним неочевидные нюансы кэширования платформы и рассмотрим пошаговое руководство по устранению этой и сопутствующих ошибок.
Рассмотрим ситуацию, с которой столкнулся автор темы. Разработчик скопировал стандартный шаблон функции СведенияОВнешнейОбработке(), зарегистрировал обработку для документа «Перемещение товаров» (Документ.ПеремещениеТоваров), но не обнаружил ожидаемой кнопки на форме.
Выясним причину. В коде регистрации была добавлена следующая команда:
ДобавитьКоманду(Команды, "Заполнить документ", "ЗаполнитьДокумент", "ВызовКлиентскогоМетода", Ложь,);
Обратите внимание на первый параметр — представление команды: "Заполнить документ". Разработчик ожидал увидеть на форме кнопку с названием самой обработки (например, «Установка закупочных цен» или «Уст.закуп.цены»), однако платформа строго следует заданным параметрам регистрации. Кнопка действительно появилась, но под стандартным именем «Заполнить документ» внутри выпадающего меню «Заполнить» в командной панели табличной части документа.
Решение: Всегда внимательно проверяйте наименования команд, которые вы передаете в таблицу команд в процедуре ДобавитьКоманду. Измените строку добавления команды, указав понятное пользователю представление:
ДобавитьКоманду(Команды, "Установить закупочные цены", "УстановитьЗакупочныеЦены", "ВызовКлиентскогоМетода", Ложь, "");
Представим, что вы исправили имя команды в конфигураторе, сохранили файл внешней обработки на диске, но в режиме «1С:Предприятие» кнопка по-прежнему отображается со старым названием или не отображается вовсе. Почему так происходит?
Дело в том, что платформа 1С не считывает функцию СведенияОВнешнейОбработке() динамически при каждом открытии формы документа. Параметры регистрации считываются только один раз — в момент добавления или обновления файла обработки в справочнике «Дополнительные отчеты и обработки».
Проанализируем правильный алгоритм обновления параметров:
В коде автора для команды указан тип запуска "ВызовКлиентскогоМетода". Это важный параметр, который накладывает жесткие требования к архитектуре самой обработки. Рассмотрим подробнее, какие варианты параметра Использование (тип запуска команды) предоставляет БСП и как их правильно обрабатывать:
При таком режиме у внешней обработки обязательно должна быть создана форма, и эта форма должна быть назначена основной формой обработки. В модуле этой формы необходимо разместить экспортную процедуру:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
// Здесь пишется клиентская логика
КонецПроцедуры
Если формы нет, либо процедура не объявлена как экспортная, либо допущена ошибка в имени — кнопка не сработает, а система выдаст ошибку о недоступности метода.
В этом случае форма обработки не требуется. Вся логика выполняется в модуле объекта обработки. Там должна присутствовать следующая экспортная процедура:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
// Логика заполнения ТЧ документа через API БСП
КонецПроцедуры
В исходном коде автора для регистрации используются строковые литералы: "ЗаполнениеОбъекта", "ВызовКлиентскогоМетода". Это рабочий вариант, но он не является лучшей практикой разработки под БСП.
При обновлении версии конфигурации или самой БСП строковые идентификаторы могут измениться или начать обрабатываться иначе. Мы рекомендуем использовать стандартный программный интерфейс БСП для заполнения параметров регистрации. Это гарантирует обратную совместимость программного кода.
Рассмотрим правильный, современный шаблон функции СведенияОВнешнейОбработке():
Функция СведенияОВнешнейОбработке() Экспорт
Назначения = Новый Массив;
Назначения.Добавить("Документ.ПеремещениеТоваров");
ПараметрыРегистрации = Новый Структура;
// Используем функции БСП вместо жестких строк для Вида обработки
ПараметрыРегистрации.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта());
ПараметрыРегистрации.Вставить("Назначение", Назначения);
ПараметрыРегистрации.Вставить("Наименование", "Установка закупочных цен (ТЧ)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка для автоматического заполнения цен в перемещении.");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); // Меняем на Ложь, если требуется работа с файлами или COM
Команды = ПолучитьТаблицуКоманд();
// Используем функцию БСП для получения типа команды
ТипЗапуска = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
ДобавитьКоманду(Команды, "Заполнить закупочные цены", "УстановитьЦены", ТипЗапуска, Ложь, "");
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
Обратите внимание на строчку в коде автора: ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);.
Если ваша обработка «Установка закупочных цен» должна выполнять какие-либо из следующих действий:
Excel.Application);то в безопасном режиме платформа 1С заблокирует выполнение этих операций по соображениям безопасности. Обработка просто аварийно завершит работу при попытке совершить небезопасное действие.
Решение: Установите значение параметра БезопасныйРежим в Ложь. При регистрации такой обработки в режиме «1С:Предприятие» администратору базы данных потребуется подтвердить доверие к данному файлу обработки, но это снимет все ограничения на работу с операционной системой и внешними файлами.
Если вы убедились, что код написан верно, кэш обновлен, но кнопка так и не появилась у конечных пользователей программы, дело может быть в административных настройках самой конфигурации:
Убедитесь, что в базе вообще включена возможность использования дополнительных обработок. Для этого перейдите в раздел НСИ и администрирование (или просто Администрирование) — Печатные формы, отчеты и обработки. Флажок «Дополнительные отчеты и обработки» должен быть обязательно включен.
В карточке регистрации вашей внешней обработки обратите внимание на табличную часть «Быстрый доступ». По умолчанию платформа может ограничить видимость команды для всех пользователей, кроме администратора системы. Настройте список пользователей или ролей, которым должна быть видна эта команда непосредственно на форме документа перемещения.
Типовой документ «Перемещение товаров» в «1С:Розница 2.2» по умолчанию полностью поддерживает подсистему дополнительных отчетов и обработок БСП. Кнопка в меню «Заполнить» внедряется на форму динамически в момент ее создания на сервере.
Однако, если ваша конфигурация была доработана (снята с поддержки) и для документа была создана индивидуальная, кастомная форма, автоматическое внедрение команд может сломаться.
Проанализируем модуль формы документа в конфигураторе. Нам нужно убедиться, что в процедуре ПриСозданииНаСервере присутствует стандартный вызов обработчика БСП:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Стандартные вызовы инициализации формы
// ...
// Интеграция с подсистемой дополнительных отчетов и обработок
ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
Без этого вызова программный интерфейс БСП не сможет «перехватить» управление формой при открытии и физически не создаст кнопку в командной панели вашей табличной части.
Мы детально разобрали процесс поиска и устранения ошибок при внедрении внешних обработок заполнения ТЧ. Чтобы ваша обработка всегда успешно отображалась на формах документов, следуйте простому правилу чек-листа: