Свой код для базы 1С: внешняя обработка, запуск по расписанию и отладка

· 9 мин

Содержание

Скрипт для 1С 8.3 чаще всего создают как внешнюю обработку : в Конфигураторе Файл → Новый → Внешняя обработка, пишете код на встроенном языке, сохраняете файл .epf и открываете его в рабочей базе через Файл → Открыть. Конфигурацию при этом менять не нужно, а файл можно запускать в любой базе с подходящей структурой.

Если код должен работать без человека — по ночам, по расписанию, из планировщика Windows, — его запускают ключом /Execute командной строки 1cv8.exe, регистрируют как дополнительную обработку с расписанием или пишут на OneScript, который подключается к базе через COM.

Подготовка: что нужно и какой вид скрипта выбрать

Для работы понадобится:

  • 🖥️ установленная платформа 1С:Предприятие 8.3 с Конфигуратором;
  • 🔑 пользователь с правом открывать внешние обработки (в типовых — роль «Полные права» или отдельное право «Интерактивное открытие внешних отчетов и обработок»);
  • 🧪 копия рабочей базы для проверки. Первый запуск любого кода, который что-то записывает, — только на копии.

Термин «скрипт» в мире 1С покрывает несколько разных механизмов. Выбор зависит от того, кто и как будет запускать код.

ВидГде живёт кодКогда подходитОграничения
Внешняя обработка .epfотдельный файлразовые операции, отчёты, массовые правкинужно право на открытие внешних файлов
Дополнительная обработкафайл, загруженный в базурегулярные задачи, запуск по расписаниютолько в конфигурациях на БСП (БП, ЗУП, УТ и др.)
Расширение .cfeрасширение конфигурациидоработка поведения типовых форм и объектовсложнее в сопровождении, нужен Конфигуратор
OneScript .osтекстовый файл вне 1Савтоматизация на сервере, обновления, выгрузкиработает с базой через COM или командную строку

Для первого скрипта берите внешнюю обработку. Она не трогает конфигурацию, не снимает её с поддержки и удаляется простым удалением файла.

Как создать внешнюю обработку в Конфигураторе: 6 шагов

  1. Запустите 1С в режиме Конфигуратор. Открывать базу не обязательно, но удобнее открыть ту, где будете тестировать: так доступны метаданные для конструктора запросов.
  2. Выберите Файл → Новый, в списке — «Внешняя обработка». Откроется окно с деревом объекта.
  3. Задайте Имя латиницей или кириллицей без пробелов, например ПоискКонтрагентовБезИНН, и понятный синоним.
  4. На вкладке форм нажмите кнопку добавления формы и создайте основную форму обработки. Конструктор предложит тип формы — оставьте управляемую.
  5. В редакторе формы на вкладке «Команды» добавьте команду, например Выполнить, и перетащите её на форму — появится кнопка. В свойствах команды у поля «Действие» нажмите лупу: платформа создаст обработчик в модуле формы.
  6. Сохраните файл: Файл → Сохранить как, расширение .epf.

Код, который работает с данными, кладите в модуль объекта обработки, а форму оставьте тонкой: кнопка → вызов сервера → метод объекта. Тогда этот же метод легко вызвать и из регламентного запуска без формы.

Встроенный язык: синтаксис и каркас модуля

Встроенный язык 1С похож на Basic с русскими ключевыми словами. Каждая инструкция заканчивается точкой с запятой, блоки закрываются парными словами: Если … КонецЕсли, Пока … КонецЦикла, Процедура … КонецПроцедуры.

Основные конструкции, без которых не обходится ни один скрипт:

  • 🔹 переменные объявляются при первом присваивании: Итог = 0;
  • 🔹 условие: Если Сумма > 1000 Тогда … ИначеЕсли … Иначе … КонецЕсли;
  • 🔹 циклы: Для Каждого Строка Из Таблица Цикл, Для Сч = 1 По 10 Цикл, Пока Выборка.Следующий() Цикл;
  • 🔹 функция возвращает значение через Возврат, процедура — нет;
  • 🔹 ключевое слово Экспорт делает метод видимым снаружи модуля.

В управляемом приложении код формы делится на клиентский и серверный. К базе данных можно обращаться только на сервере, поэтому кнопка вызывает серверную процедуру. Каркас модуля формы:

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
    Обработка = РеквизитФормыВЗначение("Объект");
    Обработка.НайтиКонтрагентовБезИНН();
КонецПроцедуры

РеквизитФормыВЗначение("Объект") превращает данные формы в полноценный объект обработки. После этого доступны все экспортные методы из модуля объекта.

Синтаксис любой функции смотрите в синтакс-помощнике: в Конфигураторе Справка → Синтакс-помощник. Проверить модуль на ошибки до запуска можно сочетанием Ctrl+F7.

Запросы к базе и запись данных в скрипте

Читать данные быстрее всего запросом. Текст запроса можно не набирать вручную: в модуле нажмите правую кнопку мыши и выберите «Конструктор запроса» — в нём таблицы и поля выбираются мышью.

Пример для модуля объекта: найти контрагентов без ИНН в 1С:Бухгалтерии 3.0 и вывести их список.

Процедура НайтиКонтрагентовБезИНН() Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Ссылка КАК Ссылка,
    |    Контрагенты.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    НЕ Контрагенты.ПометкаУдаления
    |    И НЕ Контрагенты.ЭтоГруппа
    |    И Контрагенты.ИНН = """"";

    Выборка = Запрос.Выполнить().Выбрать();
    Количество = 0;

    Пока Выборка.Следующий() Цикл
        Количество = Количество + 1;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = Выборка.Наименование;
        Сообщение.Сообщить();
    КонецЦикла;

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = СтрШаблон("Найдено без ИНН: %1", Формат(Количество, "ЧГ=0"));
    Сообщение.Сообщить();

КонецПроцедуры

Кавычки внутри строки кавычка удваивается, поэтому пустая строка в тексте запроса записывается как """".

Как изменить и записать объект

Чтобы поменять данные, получите из ссылки объект, измените реквизит и запишите:

Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Комментарий = "Проверить ИНН";
Объект.Записать();

Для документов есть режимы записи: Объект.Записать(РежимЗаписиДокумента.Проведение) проводит документ, РежимЗаписиДокумента.Запись только сохраняет.

Массовая запись в рабочей базе — операция без кнопки «Отменить». Перед запуском сделайте резервную копию (выгрузку .dt или копию каталога файловой базы) и прогоните скрипт на копии.

Если правите сотни объектов, оберните изменения в транзакцию. Тогда при сбое на середине ничего не запишется частично:

НачатьТранзакцию();
Попытка
    Для Каждого Ссылка Из СписокСсылок Цикл
        Объект = Ссылка.ПолучитьОбъект();
        Объект.Комментарий = "Проверить ИНН";
        Объект.Записать();
    КонецЦикла;
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

Свойство Объект.ОбменДанными.Загрузка = Истина ускоряет запись, потому что отключает проверки и обработчики объекта. Пользуйтесь им, только если понимаете последствия: документ в таком режиме не проведётся, а проверки заполнения не сработают.

Отладка скрипта и обработка ошибок

Отладчик подключается к внешней обработке так же, как к конфигурации.

  1. Откройте файл .epf в Конфигураторе через Файл → Открыть.
  2. Поставьте точку останова на нужной строке клавишей F9.
  3. Запустите пользовательский режим из Конфигуратора командой Отладка → Начать отладку (клавиша F5).
  4. В открывшейся 1С откройте тот же файл через Файл → Открыть и нажмите кнопку команды.
  5. Выполнение остановится на точке. Значения переменных видны в табло, шаг вперёд — 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 нужной версии платформы, запустив консоль от имени администратора.

Частые ошибки при создании скрипта

Диагностика: выберите симптом

Ещё две ловушки, о которых узнают только на практике:

  • 🐢 Запрос в цикле. Обращение к базе на каждой итерации тормозит скрипт в десятки раз. Соберите данные одним запросом, а в цикле работайте с выборкой.
  • 🔗 Обращение через точку к реквизитам ссылки. Документ.Контрагент.ИНН внутри цикла каждый раз читает объект из базы. Получите нужные поля в том же запросе.

Частые вопросы

Можно ли писать скрипты для 1С без Конфигуратора?
Внешнюю обработку без Конфигуратора не создать. Без него можно выполнять код в консолях кода и запросов — это тоже внешние обработки, их бесплатно распространяют разработчики. Для автоматизации вокруг базы подойдёт OneScript.
Чем внешняя обработка отличается от расширения?
Обработка — отдельный инструмент, который выполняет действие по команде. Расширение встраивается в конфигурацию и меняет поведение её форм и объектов, например добавляет реквизит или проверку при проведении.
Работает ли один .epf во всех базах?
Только в базах, где есть все объекты метаданных, к которым обращается код. Скрипт для Бухгалтерии 3.0 не запустится в ЗУП, если использует справочники, которых там нет.
Почему при открытии обработки 1С показывает предупреждение безопасности?
Это защита от опасных действий: внешний файл может выполнить любой код. Открывайте только файлы из проверенного источника. Отключать защиту для всех пользователей не стоит.
На каком языке пишут скрипты для 1С?
На встроенном языке 1С:Предприятия. У него есть английский синтаксис, но в типовых конфигурациях принят русский. Запросы пишутся на языке запросов, похожем на SQL.