Как доработать 1С:Бухгалтерию под учет путевых листов и сохранить автоматическое обновление

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Каждый разработчик 1С рано или поздно сталкивается с дилеммой: клиенту требуется специфический функционал, которого нет в типовом решении (например, полноценный учет путевых листов, расчет норм расхода ГСМ по одометру и автоматическое формирование проводок), но при этом критически важно сохранить конфигурацию на автоматическом обновлении. Любое грубое вмешательство в структуру метаданных превратит последующую поддержку системы в бесконечную ручную рутину.

В этой статье мы подробно разберем, как решить задачу автоматизации путевых листов в «1С:Бухгалтерия 3.0» (БП 3.0), используя современные технические возможности платформы 1С:Предприятие 8.3 и методики разработки. Мы проанализируем различные архитектурные подходы — от правильной настройки поддержки до создания расширений и интеграции внешних баз данных.

Давайте вместе разберем по шагам доступные варианты реализации этой задачи.

Вариант 1. Настройка правил поддержки: добавление новых объектов без снятия «замка» с типовых

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

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

  1. Откроем конфигуратор нашей базы данных и перейдем в меню Конфигурация — Поддержка — Настройка поддержки.
  2. Нажмем кнопку Включить возможность изменения.
  3. В появившемся окне правил поддержки для правил «Изменения разрешены» выберем вариант Объект поставщика не редактируется (или «Сохранять объект поставщика»). Это позволит оставить все типовые объекты конфигурации закрытыми на «замок».
  4. Для самой конфигурации (корневого элемента) установим статус Изменения разрешены.

После выполнения этих действий мы получаем возможность добавлять в дерево метаданных собственные справочники (например, Справочник.ТранспортныеСредства), документы (Документ.ПутевойЛист) и регистры сведений (для хранения истории показаний спидометра и норм расхода).

При этом все стандартные документы бухгалтерии (такие как Документ.ТребованиеНакладная или Документ.ПоступлениеТоваровУслуг) остаются на полной поддержке. При автоматическом обновлении через интернет или файлы обновлений 1С обновит типовые объекты без каких-либо конфликтов, а наши добавленные объекты просто перенесутся в новую версию конфигурации.

Вариант 2. Использование расширений конфигурации (на платформе 8.3.15 и выше)

Если в старых версиях платформы (например, 8.3.10) возможности расширений были сильно ограничены режимом совместимости, то в современных версиях 1С:Предприятие 8.3 расширения стали основным инструментом кастомизации.

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

Рассмотрим пример, как программно перехватить проведение документа в расширении для формирования собственных движений по ГСМ. Создадим в расширении процедуру-последователь:


&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Проверим, не заблокировано ли проведение другими механизмами
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем тип документа. Если это наш специализированный документ:
    Если Метаданные.Документы.Имя() = "Расш1_ПутевойЛист" Тогда
        РассчитатьИЗаписатьРасходТоплива(ЭтотОбъект);
    КонецЕсли;
    
КонецПроцедуры

Использование расширений минимизирует риски при обновлении основной базы. Главное правило — следить за тем, чтобы типы заимствованных объектов (если вы ссылаетесь на типовые справочники вроде Справочники.Организации или Справочники.ФизическиеЛица) не претерпевали критических изменений в новых релизах от вендора.

Вариант 3. Хранение данных во внешней базе с интеграцией по COM или HTTP-сервисам

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

Ранее для этих целей активно применялось COM-соединение. Посмотрим на классический пример подключения к внешней базе данных для выгрузки готовых проводок:


// Создание COM-соединения с внешней базой
ПараметрыПодключения = "File=""C:\DB\Waybills""; Usr=""Dispatcher""; Pwd=""123"";";
V83Connector = Новый COMОбъект("V83.COMConnector");

Попытка
    БазаПутевыхЛистов = V83Connector.Connect(ПараметрыПодключения);
Исключение
    Сообщить("Не удалось подключиться к внешней базе: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Запрос данных из внешней базы по путевым листам
ВыборкаДанных = БазаПутевыхЛистов.NewObject("Запрос");
ВыборкаДанных.Текст = 
    "ВЫБРАТЬ
    |	ПутевойЛист.Ссылка КАК Ссылка,
    |	ПутевойЛист.РасходПоНорме КАК Расход
    |ИЗ
    |	Документ.ПутевойЛист КАК ПутевойЛист
    |ГДЕ
    |	ПутевойЛист.Проведен И НЕ ПутевойЛист.Выгружен";

// Обработка данных и формирование проводок в БП 3.0
// ...

Важное примечание: В современных реалиях, особенно при использовании серверов на базе Linux и облачных технологий, использование COM-соединения считается устаревшим подходом. Вместо него настоятельно рекомендуется использовать обмен данными через HTTP-сервисы. Это позволяет передавать данные в универсальном формате JSON, работает значительно быстрее и стабильнее.

Вариант 4. Механизм БСП «Дополнительные реквизиты и сведения» и внешние печатные формы

Если доработки минимальны (например, нужно просто хранить пару дополнительных полей в типовом документе Требование-накладная, таких как «Номер путевого листа» и «Показания одометра»), изменять конфигурацию вообще не требуется.

Для этого воспользуемся штатным механизмом Библиотеки стандартных подсистем (БСП), встроенным в «1С:Бухгалтерию 3.0»:

  1. Перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Добавим к нужному документу новый дополнительный реквизит (например, «Показания одометра при выезде» с типом Число).
  3. Данный реквизит автоматически появится на управляемой форме документа в специальном разделе.
  4. Создадим внешнюю печатную форму путевого листа, которая будет программно считывать эти дополнительные реквизиты из базы данных и выводить их на печать.

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

Как автоматически формировать бухгалтерские проводки?

Каким бы из вариантов хранения данных вы ни воспользовались, в итоге вам потребуется отразить списание ГСМ в бухгалтерском учете. Чтобы не изменять логику проведения стандартных документов (например, документов списания материалов), рекомендуется программно генерировать документ ОперацияБух (Операция, введенная вручную).

Проанализируем пример кода, создающего такую операцию на основе рассчитанных данных по путевому листу:


// Создание документа ручной операции
НоваяОперация = Документы.ОперацияБух.СоздатьДокумент();
НоваяОперация.Дата = КонецДня(ДатаПутевогоЛиста);
НоваяОперация.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", ИННКомпании);
НоваяОперация.Содержание = "Списание ГСМ по путевому листу № " + НомерЛиста;
НоваяОперация.Записать();

// Формирование проводок по регистру бухгалтерии
РегистрПроводок = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
РегистрПроводок.Отбор.Регистратор.Установить(НоваяОперация.Ссылка);

НоваяПроводка = РегистрПроводок.Добавить();
НоваяПроводка.Регистратор = НоваяОперация.Ссылка;
НоваяПроводка.Период = НоваяОперация.Дата;
НоваяПроводка.Организация = НоваяОперация.Организация;

// Дебет счета учета затрат (например, 20.01 - Основное производство)
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01");
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "НоменклатурныеГруппы", НоменклатурнаяГруппа);
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "СтатьиЗатрат", СтатьяЗатратГСМ);

// Кредит счета учета материалов (10.03 - Топливо)
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.03");
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетКт, НоваяПроводка.СубконтоКт, "Номенклатура", НоменклатураГСМ);
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетКт, НоваяПроводка.СубконтоКт, "Склады", ОсновнойСклад);

// Установка суммовых показателей
НоваяПроводка.Сумма = РассчитаннаяСуммаСписания;
НоваяПроводка.КоличествоКт = РасходПоНорме;

// Запись набора проводок в базу данных
РегистрПроводок.Записать();

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

Резюме: какую стратегию выбрать?

Для того чтобы сделать правильный выбор, оцените масштаб вашей задачи:

← На главную