Переход с платформы 1С 8.2 на 8.3 и использование современных конфигураций (таких как Управление торговлей для Казахстана 3.2 или УТ 11) часто вызывает сложности с поддержкой старого торгового оборудования и внешних обработок. Основная проблема заключается в том, что старые механизмы были ориентированы на «Обычные формы» и «Толстый клиент», тогда как новые системы работают в режиме «Управляемого приложения» с жестким разделением на клиентский и серверный контексты.
В этой статье мы подробно разберем, почему старая обработка АТОЛ выдает ошибки, и как адаптировать ее под современные требования платформы 8.3.
Проанализируем типичный список ошибок, который возникает при попытке регистрации или открытия старой обработки в управляемом приложении. Чаще всего система выдает сообщения следующего вида:
Переменная не определена (КодВозвратаДиалога)Процедура или функция с указанным именем не определена (Вопрос)Процедура или функция с указанным именем не определена (Предупреждение)Переменная не определена (РежимДиалогаВопрос)Разберем причину их возникновения. В управляемом приложении модуль объекта внешней обработки выполняется на сервере. На сервере в 1С принципиально отсутствуют любые элементы интерфейса. Переменные КодВозвратаДиалога, а также функции Вопрос() и Предупреждение() являются клиентскими. Когда серверный код пытается к ним обратиться, система закономерно выдает ошибку, так как в серверном контексте их просто не существует.
Чтобы исправить ситуацию, первым делом необходимо разделить логику. Рассмотрим код процедуры, приведенный в обсуждении:
Процедура НастроитьОборудование(Модель, Параметры) Экспорт
Форма = ПолучитьФорму("ФормаНастройки");
Форма.мМодель = Модель;
Форма.мПараметры = Параметры;
Ответ = Форма.ОткрытьМодально();
Если Ответ = КодВозвратаДиалога.OK Тогда
Параметры = Форма.мПараметры;
КонецЕсли;
КонецПроцедуры
Проанализируем этот участок. Процедура ОткрытьМодально() и метод ПолучитьФорму() в модуле объекта на сервере работать не будут. Нам необходимо перенести все вызовы диалогов на сторону клиента. Если конфигурация работает в режиме «Запрет модальных вызовов» (что является стандартом для 8.3), использование ОткрытьМодально(), Вопрос() и Предупреждение() вовсе запрещено.
Для исправления необходимо заменить синхронные вызовы на асинхронные, используя ОписаниеОповещения. Однако для внешней обработки обмена это потребует полной переработки логики. В качестве временного решения для тестирования в свойствах конфигурации можно включить режим «Использовать модальные вызовы», но для стабильной работы в веб-клиенте это не поможет.
Для того чтобы современная конфигурация на базе БСП (Библиотеки стандартных подсистем) смогла подключить обработку через справочник «Дополнительные отчеты и обработки», в модуле объекта обязательно должна присутствовать функция СведенияОВнешнейОбработке().
Рассмотрим пример реализации этой функции, которую нужно добавить в самое начало модуля объекта:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Обмен с АТОЛ РМК (обновленная)");
ПараметрыРегистрации.Вставить("Версия", "2.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Обработка обмена данными с ПО АТОЛ");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Открыть обработку", "ОткрытьОбработку", "ОткрытиеФормы", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
В старых конфигурациях часто использовалась функция глЗначениеПеременной(). В УТ 11 или УТ 3.2 для Казахстана этот механизм заменен на другие вызовы (например, через модули ПараметрыСеанса или общие модули настроек).
Выясним причину ошибки: Процедура или функция с указанным именем не определена (глЗначениеПеременной). В управляемом приложении этой функции просто нет. Вам следует заменить код:
мВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");
на прямой запрос к константам или функциональным опциям, актуальным для вашей конфигурации.
Самое важное ограничение: обработка от 1С 8.2 содержит обычные формы. Управляемое приложение 1С 8.3 не может отображать обычные формы внутри своего интерфейса. Вы можете запустить их только в режиме «Толстого клиента», что крайне неудобно для современных систем.
Рассмотрим правильную стратегию действий:
goods.txt) можно оставить, но функции взаимодействия с пользователем (сообщения, прогресс-бары через Состояние()) нужно переписать с учетом директив &НаСервере и &НаКлиенте.Вместо того чтобы тратить время на адаптацию обработки десятилетней давности, проанализируем штатные возможности УТ для Казахстана 3.2. В конфигурацию уже встроена поддержка обмена с ПО АТОЛ (Frontol) через механизм «ККМ Offline».
Разберем по шагам, как настроить обмен без внешней обработки:
Относительно запроса пользователя об обмене через Email:
Штатный механизм 1С обычно работает через локальные папки или FTP. Если вам критически важно использовать почту, мы рекомендуем не переписывать обработку 1С, а воспользоваться «транспортными» утилитами. Например, настройте на кассовом компьютере и на сервере 1С облачное хранилище (Яндекс.Диск, Dropbox), которое создаст виртуальную папку. 1С будет выгружать файл в эту папку, а облачный клиент автоматически отправит его через интернет. Для программы это будет выглядеть как обычный файловый обмен, что гораздо надежнее, чем настройка SMTP/POP3 внутри 1С.
Вывод: Попытка обновить старую обработку АТОЛ с 8.2 на 8.3 «в лоб» — задача трудозатратная из-за несовместимости интерфейсов. Наилучшим решением будет переход на встроенные механизмы обмена ККМ Offline, которые поддерживают актуальные требования законодательства (маркировка, новые типы чеков) и стабильно работают на платформе 8.3.