При разработке внешних обработок в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда код, успешно работающий внутри конфигурации, перестает выполнять свои функции в формате внешнего файла (.epf). В данной статье мы подробно проанализируем причины такого поведения, разберем типичные ошибки привязки интерфейсных элементов и выясним, как правильно организовать отладку и оптимизировать работу с регистрами сведений.
Рассмотрим ситуацию, когда форма обработки открывается, кнопка нажимается, но программный код не выполняется. Самая тривиальная, но часто встречающаяся причина — это отсутствие связи между элементом формы (кнопкой) и самой командой. В управляемом приложении 1С кнопка на форме ссылается на Команду, а команда, в свою очередь, имеет обработчик в виде процедуры на языке 1С.
Выясним причину: если вы скопировали код или создали процедуру вручную, но забыли указать ее в свойствах команды или не назначили команду кнопке, то при нажатии визуально ничего происходить не будет. Проанализируем пример кода, который должен изменять путь в регистре сведений:
&НаКлиенте
Процедура Пуск(Команда)
ПускНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПускНаСервере()
счетчик = 0;
Выборка = РегистрыСведений.НастройкиТранспортаОбмена.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = Выборка.ПолучитьМенеджерЗаписи();
Запись.Прочитать();
резПоиска = Найти(Выборка.FTPСоединениеПуть, "http://www.site.ru");
Если резПоиска <> 0 Тогда
ПутьСIPАдресом = СтрЗаменить(Выборка.FTPСоединениеПуть, "http://www.site.ru", "10.86.1.252");
Запись.FTPСоединениеПуть = ПутьСIPАдресом;
Запись.Записать();
счетчик = счетчик + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Было изменено " + счетчик + " записей");
КонецПроцедуры
Чтобы этот код заработал, необходимо убедиться, что на закладке "Команды" вашей формы создана команда Пуск, у которой в свойстве Действие выбрана процедура Пуск. Затем на закладке "Элементы" нужно проверить, что кнопка связана именно с этой командой.
Часто разработчики жалуются, что точка останова во внешней обработке не срабатывает. Разберем по шагам, почему это происходит и как это исправить:
-debug. Без этого отладка серверного кода (процедуры с префиксом &НаСервере) невозможна в принципе.Файл -> Открыть в режиме "1С:Предприятие" при активном подключении к отладке. Также в параметрах Конфигуратора (Сервис -> Параметры -> Запуск 1С:Предприятия -> Дополнительно) установите флаг "Начинать отладку при запуске".Посмотрим на пример кода автора еще раз. Использование МенеджерЗаписи внутри цикла Выборка.Следующий() — это крайне неоптимальный путь. Рассмотрим подробнее почему:
Объект МенеджерЗаписи предназначен для работы с одной конкретной записью регистра. Когда мы используем его в цикле, на каждой итерации происходят следующие действия:
- Выполняется отдельный запрос к СУБД для поиска записи.
- Открывается транзакция.
- Выполняется запись данных.
- Транзакция фиксируется.
Если в регистре тысячи записей, это вызовет огромную нагрузку на систему. Правильнее использовать РегистрСведенийНаборЗаписей. Рассмотрим пример оптимизированного кода:
&НаСервере
Процедура ОптимизированныйПускНаСервере()
Набор = РегистрыСведений.НастройкиТранспортаОбмена.СоздатьНаборЗаписей();
Набор.Прочитать(); // Читаем все записи разом (или устанавливаем отбор)
счетчик = 0;
Для Каждого Запись Из Набор Цикл
Если СтрНайти(Запись.FTPСоединениеПуть, "http://www.site.ru") > 0 Тогда
Запись.FTPСоединениеПуть = СтрЗаменить(Запись.FTPСоединениеПуть, "http://www.site.ru", "10.86.1.252");
счетчик = счетчик + 1;
КонецЕсли;
КонецЦикла;
Если счетчик > 0 Тогда
Набор.Записать(); // Записываем всё одним пакетом
КонецЕсли;
Сообщить("Успешно обновлено " + счетчик + " записей");
КонецПроцедуры
Важный нюанс: Использование Набор.Записать() без установленных отборов перезапишет весь регистр. В данном случае это допустимо, так как мы сначала прочитали весь набор. Но в больших регистрах всегда используйте Отбор, чтобы не заблокировать всю таблицу целиком.
Если ваша внешняя обработка запускается из справочника "Дополнительные отчеты и обработки", она по умолчанию может работать в безопасном режиме. Проанализируем последствия этого:
В безопасном режиме запрещены многие операции, включая прямую модификацию данных, если на это нет явного разрешения в профиле безопасности. Если код "молча" ничего не делает, стоит проверить, не включен ли этот режим. Чтобы выполнить код с полными правами, разработчики часто используют процедуру в общем модуле с установленным флагом "Привилегированный", которую вызывают из внешней обработки.
Также стоит помнить про RLS (Record Level Security). Если для текущего пользователя настроены ограничения на уровне записей для регистра НастройкиТранспортаОбмена, метод Выбрать() может вернуть пустой результат, и цикл просто не начнется. При этом никаких сообщений об ошибках прав доступа система не выдаст.
Подведем итог нашему исследованию. Если внешняя обработка "не отрабатывает":
МенеджерЗаписи на НаборЗаписей для повышения быстродействия и стабильности системы.СтрНайти() вместо устаревшей Найти(), чтобы код соответствовал стандартам разработки.Следуя этим правилам, вы сможете эффективно разрабатывать и диагностировать внешние обработки любой сложности, обеспечивая корректную работу с данными в конфигурациях на базе 1С:Предприятие 8.3.