Свой код для базы 1С: внешняя обработка, запуск по расписанию и отладка
Содержание
Скрипт для 1С 8.3 чаще всего создают как внешнюю обработку
: в Конфигураторе Файл → Новый → Внешняя обработка, пишете код на встроенном языке, сохраняете файл .epf и открываете его в рабочей базе через Файл → Открыть. Конфигурацию при этом менять не нужно, а файл можно запускать в любой базе с подходящей структурой.
Если код должен работать без человека — по ночам, по расписанию, из планировщика Windows, — его запускают ключом /Execute командной строки 1cv8.exe, регистрируют как дополнительную обработку с расписанием или пишут на OneScript, который подключается к базе через COM.
Подготовка: что нужно и какой вид скрипта выбрать
Для работы понадобится:
- 🖥️ установленная платформа 1С:Предприятие 8.3 с Конфигуратором;
- 🔑 пользователь с правом открывать внешние обработки (в типовых — роль «Полные права» или отдельное право «Интерактивное открытие внешних отчетов и обработок»);
- 🧪 копия рабочей базы для проверки. Первый запуск любого кода, который что-то записывает, — только на копии.
Термин «скрипт» в мире 1С покрывает несколько разных механизмов. Выбор зависит от того, кто и как будет запускать код.
| Вид | Где живёт код | Когда подходит | Ограничения |
|---|---|---|---|
Внешняя обработка .epf | отдельный файл | разовые операции, отчёты, массовые правки | нужно право на открытие внешних файлов |
| Дополнительная обработка | файл, загруженный в базу | регулярные задачи, запуск по расписанию | только в конфигурациях на БСП (БП, ЗУП, УТ и др.) |
Расширение .cfe | расширение конфигурации | доработка поведения типовых форм и объектов | сложнее в сопровождении, нужен Конфигуратор |
OneScript .os | текстовый файл вне 1С | автоматизация на сервере, обновления, выгрузки | работает с базой через COM или командную строку |
Для первого скрипта берите внешнюю обработку. Она не трогает конфигурацию, не снимает её с поддержки и удаляется простым удалением файла.
Как создать внешнюю обработку в Конфигураторе: 6 шагов
- Запустите 1С в режиме Конфигуратор. Открывать базу не обязательно, но удобнее открыть ту, где будете тестировать: так доступны метаданные для конструктора запросов.
- Выберите
Файл → Новый, в списке — «Внешняя обработка». Откроется окно с деревом объекта. - Задайте Имя латиницей или кириллицей без пробелов, например
ПоискКонтрагентовБезИНН, и понятный синоним. - На вкладке форм нажмите кнопку добавления формы и создайте основную форму обработки. Конструктор предложит тип формы — оставьте управляемую.
- В редакторе формы на вкладке «Команды» добавьте команду, например
Выполнить, и перетащите её на форму — появится кнопка. В свойствах команды у поля «Действие» нажмите лупу: платформа создаст обработчик в модуле формы. - Сохраните файл:
Файл → Сохранить как, расширение.epf.
Код, который работает с данными, кладите в модуль объекта обработки, а форму оставьте тонкой: кнопка → вызов сервера → метод объекта. Тогда этот же метод легко вызвать и из регламентного запуска без формы.
Встроенный язык: синтаксис и каркас модуля
Встроенный язык 1С похож на Basic с русскими ключевыми словами. Каждая инструкция заканчивается точкой с запятой, блоки закрываются парными словами: Если … КонецЕсли, Пока … КонецЦикла, Процедура … КонецПроцедуры.
Основные конструкции, без которых не обходится ни один скрипт:
- 🔹 переменные объявляются при первом присваивании:
Итог = 0; - 🔹 условие:
Если Сумма > 1000 Тогда … ИначеЕсли … Иначе … КонецЕсли; - 🔹 циклы:
Для Каждого Строка Из Таблица Цикл,Для Сч = 1 По 10 Цикл,Пока Выборка.Следующий() Цикл; - 🔹 функция возвращает значение через
Возврат, процедура — нет; - 🔹 ключевое слово
Экспортделает метод видимым снаружи модуля.
В управляемом приложении код формы делится на клиентский и серверный. К базе данных можно обращаться только на сервере, поэтому кнопка вызывает серверную процедуру. Каркас модуля формы:
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
Обработка = РеквизитФормыВЗначение("Объект");
Обработка.НайтиКонтрагентовБезИНН();
КонецПроцедуры
РеквизитФормыВЗначение("Объект") превращает данные формы в полноценный объект обработки. После этого доступны все экспортные методы из модуля объекта.
Синтаксис любой функции смотрите в синтакс-помощнике: в Конфигураторе Справка → Синтакс-помощник. Проверить модуль на ошибки до запуска можно сочетанием Ctrl+F7.
Запросы к базе и запись данных в скрипте
Читать данные быстрее всего запросом. Текст запроса можно не набирать вручную: в модуле нажмите правую кнопку мыши и выберите «Конструктор запроса» — в нём таблицы и поля выбираются мышью.
Пример для модуля объекта: найти контрагентов без ИНН в 1С:Бухгалтерии 3.0 и вывести их список.
Процедура НайтиКонтрагентовБезИНН() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления
| И НЕ Контрагенты.ЭтоГруппа
| И Контрагенты.ИНН = """"";
Выборка = Запрос.Выполнить().Выбрать();
Количество = 0;
Пока Выборка.Следующий() Цикл
Количество = Количество + 1;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЦикла;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Найдено без ИНН: %1", Формат(Количество, "ЧГ=0"));
Сообщение.Сообщить();
КонецПроцедуры
Кавычки внутри строки кавычка удваивается, поэтому пустая строка в тексте запроса записывается как """".
Как изменить и записать объект
Чтобы поменять данные, получите из ссылки объект, измените реквизит и запишите:
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Комментарий = "Проверить ИНН";
Объект.Записать();
Для документов есть режимы записи: Объект.Записать(РежимЗаписиДокумента.Проведение) проводит документ, РежимЗаписиДокумента.Запись только сохраняет.
Массовая запись в рабочей базе — операция без кнопки «Отменить». Перед запуском сделайте резервную копию (выгрузку .dt или копию каталога файловой базы) и прогоните скрипт на копии.
Если правите сотни объектов, оберните изменения в транзакцию. Тогда при сбое на середине ничего не запишется частично:
НачатьТранзакцию();
Попытка
Для Каждого Ссылка Из СписокСсылок Цикл
Объект = Ссылка.ПолучитьОбъект();
Объект.Комментарий = "Проверить ИНН";
Объект.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Свойство Объект.ОбменДанными.Загрузка = Истина ускоряет запись, потому что отключает проверки и обработчики объекта. Пользуйтесь им, только если понимаете последствия: документ в таком режиме не проведётся, а проверки заполнения не сработают.
Отладка скрипта и обработка ошибок
Отладчик подключается к внешней обработке так же, как к конфигурации.
- Откройте файл
.epfв Конфигураторе черезФайл → Открыть. - Поставьте точку останова на нужной строке клавишей
F9. - Запустите пользовательский режим из Конфигуратора командой
Отладка → Начать отладку(клавишаF5). - В открывшейся 1С откройте тот же файл через
Файл → Открытьи нажмите кнопку команды. - Выполнение остановится на точке. Значения переменных видны в табло, шаг вперёд —
F10, вход в процедуру —F11.
В пользовательском режиме открывайте именно тот файл, который открыт в Конфигураторе. Если сохранили копию в другую папку, точки останова не сработают.
Для клиент-серверной базы отладка серверного кода требует, чтобы сервер 1С был запущен с разрешённой отладкой. Если точки на &НаСервере не срабатывают, попросите администратора сервера проверить настройку отладки.
Как перехватывать ошибки
Ошибку во время выполнения ловит конструкция Попытка … Исключение … КонецПопытки. Внутри блока Исключение текст ошибки отдают функции ОписаниеОшибки() и ИнформацияОбОшибке().
Попытка
Объект.Записать();
Исключение
Текст = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Скрипт.ПоискКонтрагентов",
УровеньЖурналаРегистрации.Ошибка, , Объект.Ссылка, Текст);
КонецПопытки;
Запись в журнал регистрации нужна для скриптов, которые работают без человека: утром ошибки можно посмотреть в Администрирование → Обслуживание → Журнал регистрации (путь для БП 3.0) с отбором по имени события.
Собственную ошибку, которая остановит выполнение, вызывают так: ВызватьИсключение "Не заполнена организация";.
Запуск скрипта по расписанию и из командной строки
Готовую обработку можно запускать без открытия программы вручную. Есть три рабочих пути.
Ключ /Execute и планировщик Windows
Платформа умеет открыть внешнюю обработку сразу после старта:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Робот" /P"пароль" /Execute "D:\Scripts\ПоискКонтрагентов.epf" /DisableStartupMessages /Out"D:\Scripts\log.txt"
Номер версии в пути подставьте свой — посмотрите папку в C:\Program Files\1cv8\. Для серверной базы вместо /F указывается /S"сервер\имябазы".
Чтобы обработка отработала и закрылась сама, в модуле формы вызовите действие в обработчике ПриОткрытии, а в конце — ЗавершитьРаботуСистемы(Ложь). Строку с командной строкой сохраните в .bat и добавьте задание в Планировщик заданий Windows.
Пароль в .bat лежит открытым текстом. Заведите для скрипта отдельного пользователя 1С с минимальными правами и закройте доступ к папке со скриптом.
Параметр /C"текст" передаёт строку в программу, внутри кода она доступна через глобальную переменную ПараметрЗапуска. Так один файл может выполнять разные режимы.
Дополнительная обработка с расписанием (БСП)
В типовых конфигурациях на Библиотеке стандартных подсистем обработку можно загрузить в базу и поставить на расписание без внешнего планировщика. Путь в БП 3.0: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
Чтобы БСП приняла файл, в модуле объекта нужна экспортная функция СведенияОВнешнейОбработке() и процедура ВыполнитьКоманду():
Функция СведенияОВнешнейОбработке() Экспорт
Параметры = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
Параметры.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
Параметры.Версия = "1.0";
Команда = Параметры.Команды.Добавить();
Команда.Представление = "Поиск контрагентов без ИНН";
Команда.Идентификатор = "ПоискБезИНН";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат Параметры;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ПоискБезИНН" Тогда
НайтиКонтрагентовБезИНН();
КонецЕсли;
КонецПроцедуры
После загрузки в карточке дополнительной обработки у команды серверного типа можно задать расписание. Выполнять её будет регламентное задание, поэтому в файловой базе код запустится только когда база кем-то открыта, а в клиент-серверной — силами сервера 1С.
OneScript и COM-соединение
OneScript — отдельный бесплатный интерпретатор с синтаксисом встроенного языка 1С. Скрипт .os запускается командой oscript script.os и годится для задач вокруг базы: выгрузок, обновлений, резервного копирования. К данным базы он подключается через COM-соединитель:
Коннектор = Новый COMОбъект("V83.COMConnector");
База = Коннектор.Connect("File=""D:\Bases\Buh"";Usr=""Робот"";Pwd=""пароль""");
Сообщить(База.Справочники.Контрагенты.НайтиПоКоду("00-000001").Наименование);
COM-соединитель (comcntr.dll) должен быть зарегистрирован в системе, а его разрядность — совпадать с разрядностью процесса, который его вызывает. Регистрируют его командой regsvr32 из папки bin нужной версии платформы, запустив консоль от имени администратора.
Частые ошибки при создании скрипта
Ещё две ловушки, о которых узнают только на практике:
- 🐢 Запрос в цикле. Обращение к базе на каждой итерации тормозит скрипт в десятки раз. Соберите данные одним запросом, а в цикле работайте с выборкой.
- 🔗 Обращение через точку к реквизитам ссылки.
Документ.Контрагент.ИННвнутри цикла каждый раз читает объект из базы. Получите нужные поля в том же запросе.