Обработка данных в 1С 8.3: от файла загрузки до запуска по расписанию

· 10 мин

Содержание

Чтобы настроить обработку в 1С, создайте внешнюю обработку (.epf) в Конфигураторе, добавьте в модуль объекта функцию СведенияОВнешнейОбработке() и подключите файл в разделе Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. После регистрации обработку можно запускать из меню, давать доступ отдельным пользователям и ставить на расписание.

Механизм общий для платформы 8.3 и типовых конфигураций на библиотеке стандартных подсистем: БП 3.0, ЗУП 3.1, УТ 11. Различаются только пути меню. Загрузка, выгрузка и обмен файлами строятся по одной схеме: прочитать файл, сопоставить данные с объектами базы, записать в транзакции, сохранить протокол.

Что выбрать: встроенный механизм, внешняя обработка или расширение

Не каждую задачу обработки данных нужно решать кодом. Сначала проверьте, нет ли готового механизма.

ИнструментКогда подходитОграничения
Синхронизация данных (типовой обмен)Обмен между типовыми конфигурациями: УТ ↔ БП, ЗУП → БПТолько поддерживаемые пары конфигураций
Загрузка из табличного документа в спискахРазовая загрузка номенклатуры, контрагентов, цен из ExcelОграниченный набор объектов, сопоставление колонок вручную
Внешняя обработка (.epf)Нестандартный формат файла, регулярная загрузка или выгрузка, массовая правкаНужен программист, работает в безопасном режиме, пока не разрешено иное
Расширение конфигурации (.cfe)Нужно встроить логику в документы, формы, регламентные заданияСложнее в сопровождении при обновлениях
Обработка внутри конфигурацииСвоя (нетиповая) конфигурацияСнимает типовую конфигурацию с поддержки

Для типовых БП 3.0, ЗУП 3.1 и УТ 11 почти всегда правильный выбор — внешняя обработка. Она не меняет конфигурацию, обновления ставятся без конфликтов, а файл можно заменить за минуту.

Подготовка окружения

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

Пути к списку дополнительных обработок:

КонфигурацияПуть меню
Бухгалтерия предприятия 3.0Администрирование → Печатные формы, отчеты и обработки
Зарплата и управление персоналом 3.1Администрирование → Печатные формы, отчеты и обработки
Управление торговлей 11НСИ и администрирование → Печатные формы, отчеты и обработки

Создание и регистрация внешней обработки

В Конфигураторе выберите Файл → Новый → Внешняя обработка. Добавьте форму, реквизиты (например, ПутьКФайлу, ТолькоПроверка) и сохраните файл с расширением .epf.

Чтобы обработка регистрировалась в типовой конфигурации, в модуле объекта нужна экспортная функция. Минимальный вариант для глобальной обработки с серверной командой:

Функция СведенияОВнешнейОбработке() Экспорт

    Параметры = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    Параметры.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    Параметры.Версия = "1.0";
    Параметры.БезопасныйРежим = Истина;

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

    Возврат Параметры;

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт

    Если ИдентификаторКоманды = "ЗагрузкаОстатков" Тогда
        ЗагрузитьОстатки();
    КонецЕсли;

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

Тип команды выбирайте по задаче:

  • 🖥 Открытие формы — пользователь сам выбирает файл и смотрит результат.
  • ⚙️ Вызов серверного метода — работа без формы. Только такие команды можно ставить на расписание.
  • 🔁 Вызов клиентского метода — нужен доступ к файлам на компьютере пользователя без формы.

Регистрация: откройте список дополнительных обработок, нажмите «Добавить из файла», выберите .epf. В карточке укажите разделы, где команда появится, и пользователей с доступом. Новая версия загружается в ту же карточку через «Загрузить из файла» — ссылки на обработку и настройки сохраняются.

Если поле Версия не меняется, при загрузке новой версии легко перепутать, что сейчас работает в базе. Повышайте номер при каждой правке.

Чтение файлов: кодировки, разделители, Excel и JSON

Главная ловушка: код формы выполняется на клиенте, а запись в базу — на сервере. Файл, выбранный на компьютере пользователя, сервер не видит. Его нужно передать через временное хранилище: на клиенте поместить файл (НачатьПомещениеФайлаНаСервер или аналогичные методы), на сервере получить двоичные данные по адресу и записать во временный файл.

&НаСервере
Функция ВременныйФайлИзХранилища(АдресВХранилище, Расширение)

    Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);
    ИмяФайла = ПолучитьИмяВременногоФайла(Расширение);
    Данные.Записать(ИмяФайла);
    Возврат ИмяФайла;

КонецФункции

После обработки удалите временный файл через УдалитьФайлы(ИмяФайла).

CSV и текстовые файлы

Перед кодом откройте файл в текстовом редакторе и ответьте на три вопроса:

  • 🔤 Кодировка. Выгрузки из старых программ и банков часто в windows-1251, из веб-сервисов — в UTF-8.
  • ✂️ Разделитель. Точка с запятой, запятая или табуляция.
  • 🔢 Числа и даты. Десятичная точка или запятая, формат даты ДД.ММ.ГГГГ или ГГГГ-ММ-ДД.
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку(); // заголовок, пропускаем
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
    Поля = СтрРазделить(Строка, ";", Истина);
    Если Поля.Количество() >= 3 Тогда
        Артикул = СокрЛП(Поля[0]);
        Количество = Число(СтрЗаменить(Поля[2], ",", "."));
        // поиск номенклатуры по артикулу и запись
    КонецЕсли;
    Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

Для файла в windows-1251 замените кодировку на КодировкаТекста.ANSI. Если в тексте «кракозябры», почти всегда дело в кодировке.

Excel (xlsx, xls)

Платформа 8.3 читает Excel в табличный документ без установленного Excel:

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла);
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
    Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
    Цена = ТабДок.Область(НомерСтроки, 3).Текст;
    // преобразование и запись
КонецЦикла;

Ячейки читаются как текст. Числа приводите явно, пустые строки в конце листа пропускайте проверкой на пустой артикул.

JSON и XML

Для JSON используйте ЧтениеJSON и функцию ПрочитатьJSON — она вернёт структуру или массив. Для XML — ЧтениеXML; если формат описан XDTO-пакетом, удобнее ФабрикаXDTO.ПрочитатьXML.

Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ИмяФайла);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();

Алгоритм обработки: сопоставление и трансформация данных

Загрузка почти всегда идёт в три этапа. Не смешивайте их в одном цикле.

  1. Разбор. Прочитать файл в таблицу значений: колонки «Артикул», «Наименование», «Количество», «Цена», «НомерСтроки».
  2. Сопоставление. Найти объекты 1С одним запросом, а не поиском на каждой строке. Передайте таблицу в запрос как параметр, соедините со справочником по артикулу или ИНН.
  3. Запись. Создавать и изменять объекты только после того, как вся таблица проверена.
Сопоставление полей
Артикул→Номенклатура.Артикул (поиск по реквизиту)
ИНН поставщика→Контрагенты.ИНН (поиск, без создания)
Количество→Число, запятая заменяется на точку
Дата документа→Дата из строки ДД.ММ.ГГГГ
Ставка НДС→Перечисление ставок НДС

Что решить заранее, до написания кода:

  • 🆕 Нет объекта в базе — создавать новый или пропускать строку с ошибкой. Для контрагентов и номенклатуры безопаснее пропускать: дубли потом чистить дольше, чем завести вручную.
  • 🔁 Повторная загрузка того же файла — обновлять существующий документ по номеру и дате или создавать новый. Без этого правила один и тот же файл, загруженный дважды, задвоит остатки.
  • 🧮 Округление — до какого знака округлять цены и количество.

Поиск по коду или наименованию через НайтиПоНаименованию на каждой строке на файле в 10 000 строк даст 10 000 обращений к базе. Один запрос с временной таблицей сделает то же быстрее в разы.

Транзакции и целостность: загрузка без половины данных

Если обработка упала на 600-й строке из 1000, в базе не должно остаться 599 записанных документов без остальных. Для этого запись оборачивают в транзакцию:

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

Одна транзакция на весь файл подходит для сотен строк. Для десятков тысяч она держит блокировки долго и мешает остальным пользователям. Тогда пишите пакетами: например, по 500 строк в транзакции, а номер последнего успешного пакета сохраняйте, чтобы продолжить с места остановки.

СхемаКогдаРиск
Одна транзакция на файлДо ~1 000 строк, данные связаны между собойДолгие блокировки на больших файлах
Пакеты по N строкБольшие файлы, строки независимыЧастично загруженный файл, нужна дозагрузка
Транзакция на каждый объектСправочники, где ошибка одной строки не влияет на другиеМедленнее, больше записей в журнал

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

Внутри транзакции не перехватывайте исключение, чтобы «пропустить плохую строку» и продолжить: после ошибки записи транзакция уже испорчена, и фиксация вызовет новую ошибку. Плохие строки отсекайте на этапе проверки, до НачатьТранзакцию().

Форма обработки: прогресс и диалог с пользователем

Пользователь должен видеть три вещи: что выбрано, что происходит и чем закончилось.

  • 📂 Выбор файла — поле с кнопкой выбора и фильтром расширений (*.xlsx, *.csv).
  • 👀 Предпросмотр — таблица на форме с разобранными строками и колонкой «Статус» до записи. Пользователь видит, какие строки не сопоставились.
  • ✅ Флаг «Только проверка» — прогон без записи в базу. Полезен при первой загрузке нового поставщика.
  • 📊 Итог — сколько загружено, сколько пропущено и почему.

Сообщения выводите через Сообщение = Новый СообщениеПользователю, указывая Сообщение.Текст, и вызывайте Сообщение.Сообщить(). Метод Сообщить тоже работает, но не позволяет привязать сообщение к полю формы.

Для коротких операций на клиенте хватает Состояние("Обработано строк: " + Формат(Счетчик, "ЧГ=0"), Процент). Если загрузка идёт дольше минуты, выносите её в фоновое задание: форма не «зависнет», а пользователь сможет закрыть её. В типовых конфигурациях для этого есть модуль ДлительныеОперации библиотеки стандартных подсистем; прогресс из фонового задания передаётся через ДлительныеОперации.СообщитьПрогресс.

Журнал ошибок обработки и разбор сбоев

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

Исключение
    ЗаписьЖурналаРегистрации("ЗагрузкаОстатков",
        УровеньЖурналаРегистрации.Ошибка, , ,
        "Строка " + Формат(НомерСтроки, "ЧГ=0") + ": "
        + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

Своё имя события (ЗагрузкаОстатков) позволяет отфильтровать журнал только по вашей обработке. В БП 3.0 журнал открывается через Администрирование → Обслуживание → Журнал регистрации, фильтр по событию задаётся в отборе.

Что записывать:

  • 🟢 начало и конец запуска, имя файла, число строк;
  • 🔴 каждую ошибку с номером строки файла и текстом исключения;
  • 🟡 предупреждения: пропущенные строки, не найденные объекты.

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

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

Запуск обработки по расписанию

Регулярная загрузка (курсы, прайсы поставщика, заказы из интернет-магазина) не должна зависеть от того, нажал ли кто-то кнопку.

Через дополнительные обработки (без изменения конфигурации)

  1. Зарегистрируйте глобальную обработку с командой типа «Вызов серверного метода».
  2. В карточке обработки, в списке команд, задайте расписание для этой команды: периодичность, время запуска, дни недели.
  3. Включите использование регламентных заданий, если они отключены в базе.
  4. Проверьте первый запуск в журнале регистрации по имени своего события.

Такой код работает без пользователя и без формы. Файлы он берёт из папки, доступной серверу 1С (сетевой путь с правами учётной записи, от которой запущена служба), а не с рабочего стола бухгалтера.

В файловой базе регламентные задания выполняются, только пока открыт хотя бы один сеанс клиента. Если ночью базу никто не держит открытой, задание не запустится.

Через командную строку и планировщик Windows

Альтернатива для файловых баз — запуск клиента 1С с параметром /Execute, который открывает внешнюю обработку сразу после входа:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Buh" /N "Робот" /P "пароль" /Execute "D:\Scripts\zagruzka.epf" /C "auto"

Параметр /C передаёт строку в обработку, её читают через ПараметрЗапуска. Например, при значении auto обработка сама выполняет загрузку и завершает сеанс через ЗавершитьРаботуСистемы(Ложь). Задачу создайте в планировщике заданий Windows под отдельной учётной записью.

Не храните пароль администратора в bat-файле. Заведите отдельного пользователя 1С с правами только на нужную загрузку.

Перед включением расписания

Перед запуском по расписанию
Выполнено: 0 / 6

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

Чем внешняя обработка отличается от расширения?
Внешняя обработка — отдельный файл .epf, который выполняет действие по команде. Расширение (.cfe) встраивается в конфигурацию и может менять формы, документы и добавлять регламентные задания.
Нужно ли перерегистрировать обработку после обновления конфигурации?
Обычно нет: карточка и настройки сохраняются. Проверить стоит, если обработка обращается к реквизитам или процедурам типовых модулей, — после обновления их могли переименовать.
Можно ли запустить обработку в базе 1С:Фреш или другом облаке?
Да, если провайдер разрешает дополнительные обработки. В сервисе обработка проходит проверку и работает в безопасном режиме, прямой доступ к диску ей недоступен.
Как передать обработку другому пользователю без права открывать внешние файлы?
Зарегистрируйте её в списке дополнительных обработок и укажите этого пользователя в карточке. Он увидит команду в выбранном разделе.
Почему обработка в файловой базе работает, а в клиент-серверной — нет?
В клиент-серверной базе серверный код выполняется на сервере 1С под учётной записью службы. Пути к файлам и права на папки там другие, чем на компьютере пользователя.