При автоматизации рутинных задач в среде 1С:Предприятие часто возникает необходимость запускать внешнюю обработку через командную строку (BAT-файл) и передавать в неё определённые данные: идентификатор склада, дату, путь к файлу импорта или любую другую текстовую информацию. В этой статье мы подробно разберем, как реализовать этот механизм, настроить командную строку и правильно обработать полученные данные внутри 1С как для обычных, так и для управляемых форм.
Для реализации нашей задачи в 1С предусмотрен специальный ключ запуска /C. Рассмотрим структуру команды запуска более детально. Ключ /C позволяет передать в прикладное решение строку текста. К этой строке можно обратиться из любой точки конфигурации или внешней обработки, используя свойство глобального контекста ПараметрЗапуска. Важно понимать, что этот ключ принимает только одно строковое значение, поэтому, если нам нужно передать несколько параметров, их придется объединить в одну строку с использованием разделителей.
Разберем пример типичного BAT-файла. Представим, что нам нужно запустить базу «Управление торговлей 10.3», открыть внешнюю обработку и передать в неё наименование склада для автоматического выбора. Аналогичным образом настраивается обработка для переноса данных между похожими конфигурациями 1С.
Проанализируем структуру скрипта:
chcp 1251
"C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\1C\TradeBase" /N "Администратор" /P "password" /Execute "C:\External\MyProcess.epf" /C "Основной склад"
Разберем, что означают эти ключи:
chcp 1251 — устанавливает кодировку командной строки Windows-1251. Это критически важно для корректной передачи кириллических символов (русских букв) в 1С.ENTERPRISE — режим запуска «1С:Предприятие»./F — путь к файловой базе данных./N и /P — имя пользователя и пароль./Execute — путь к внешней обработке (.epf), которая должна открыться сразу после запуска./C — тот самый ключ, после которого в кавычках указывается наш параметр.Теперь перейдем к коду внутри внешней обработки. В обычных формах (например, в УТ 10.3) основным местом для перехвата параметра является процедура ПриОткрытии в модуле формы обработки. Выясним, как программно найти нужный объект, используя переданную строку.
Рассмотрим пример кода:
Процедура ПриОткрытии()
// Проверяем, не пустой ли параметр передан при запуске
Если ЗначениеЗаполнено(ПараметрЗапуска) Тогда
// Попробуем найти склад по наименованию, которое мы передали в ключе /C
НайденныйСклад = Справочники.Склады.НайтиПоНаименованию(СокрЛП(ПараметрЗапуска));
Если НЕ НайденныйСклад.Пустая() Тогда
// Устанавливаем найденный склад в реквизит формы
СкладДляЗагрузки = НайденныйСклад;
Сообщить("Параметр успешно принят: " + ПараметрЗапуска);
Иначе
Сообщить("Склад с наименованием '" + ПараметрЗапуска + "' не найден!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В данном примере мы используем глобальную переменную ПараметрЗапуска. Функция СокрЛП() помогает избавиться от лишних пробелов, которые могли случайно попасть из командной строки.
В управляемом приложении принцип работы сохраняется, однако код необходимо разделять на клиентскую и серверную части. Проанализируем ситуацию: свойство ПараметрЗапуска доступно и на клиенте, и на сервере, но поиск в справочниках возможен только на стороне сервера.
Рассмотрим реализацию для управляемой формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(ПараметрЗапуска) Тогда
ОбработатьПараметрНаСервере(ПараметрЗапуска);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьПараметрНаСервере(Знач ТекстПараметра)
// Выполняем поиск объекта на сервере
СкладОбъект = Справочники.Склады.НайтиПоНаименованию(ТекстПараметра);
Если НЕ СкладОбъект.Пустая() Тогда
Объект.Склад = СкладОбъект;
КонецЕсли;
КонецПроцедуры
Часто одного параметра недостаточно. Поскольку ключ /C принимает только одну строку, мы применим хитрость: склеим несколько значений через разделитель (например, через точку с запятой) в BAT-файле, а в 1С разберем эту строку обратно.
Пример BAT-файла с несколькими значениями:
/C "Основной склад;Закупка;01.01.2023"
Посмотрим, как разобрать такую строку в коде 1С. Для версий платформы 8.3.6 и выше мы можем использовать удобную функцию СтрРазделить():
МассивПараметров = СтрРазделить(ПараметрЗапуска, ";");
Если МассивПараметров.Количество() >= 3 Тогда
ИмяСклада = МассивПараметров[0];
ТипОперации = МассивПараметров[1];
ДатаНачала = МассивПараметров[2];
КонецЕсли;
Если же вы работаете на старой платформе (8.2 или ранние 8.3), где функции СтрРазделить еще нет, проанализируем альтернативный способ через СтрЗаменить:
Текст = СтрЗаменить(ПараметрЗапуска, ";", Символы.ПС);
Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
Значение = СтрПолучитьСтроку(Текст, НомерСтроки);
// Обработка каждого значения
КонецЦикла;
Если ваша задача подразумевает выполнение обработки в фоновом режиме без участия пользователя, важно не только запустить процесс, но и корректно его завершить. Если этого не сделать, сеанс 1С останется висеть в памяти сервера или компьютера. В таких сценариях обслуживания также применяется программа для автоматического архивирования и обновления баз 1С.
Для автоматического закрытия программы после выполнения всех действий, добавьте в конец вашей основной логики команду:
ЗавершитьРаботуСистемы(Ложь);
Параметр Ложь указывает системе, что не нужно запрашивать у пользователя подтверждение выхода (вопрос "Вы действительно хотите выйти?").
Рассмотрим наиболее частые ошибки при работе с параметрами запуска:
/C "Склад №1"..bat сохранен в кодировке ANSI (в блокноте при сохранении выберите кодировку ANSI/Windows-1251), а не в UTF-8.Попытка ... Исключение и записывать все ошибки в текстовый лог-файл, чтобы иметь возможность разобраться, почему скрипт не отработал.Таким образом, мы проанализировали полный цикл передачи данных: от настройки кодировки в командной строке Windows до программной обработки строк в различных версиях платформы 1С. Использование ПараметрЗапуска в сочетании с разделителями строк является самым гибким и надежным способом интеграции 1С с внешними сценариями автоматизации.