Каждый разработчик 1С рано или поздно сталкивается с дилеммой: клиенту требуется специфический функционал, которого нет в типовом решении (например, полноценный учет путевых листов, расчет норм расхода ГСМ по одометру и автоматическое формирование проводок), но при этом критически важно сохранить конфигурацию на автоматическом обновлении. Любое грубое вмешательство в структуру метаданных превратит последующую поддержку системы в бесконечную ручную рутину.
В этой статье мы подробно разберем, как решить задачу автоматизации путевых листов в «1С:Бухгалтерия 3.0» (БП 3.0), используя современные технические возможности платформы 1С:Предприятие 8.3 и методики разработки. Мы проанализируем различные архитектурные подходы — от правильной настройки поддержки до создания расширений и интеграции внешних баз данных.
Давайте вместе разберем по шагам доступные варианты реализации этой задачи.
Распространенное заблуждение начинающих разработчиков заключается в том, что для внесения любых изменений конфигурацию нужно полностью снять с поддержки. Это не так. В платформе 1С реализован гибкий механизм управления правилами поддержки.
Выясним, как правильно включить возможность изменения, не нарушая автоматического обновления типовой конфигурации:
После выполнения этих действий мы получаем возможность добавлять в дерево метаданных собственные справочники (например, Справочник.ТранспортныеСредства), документы (Документ.ПутевойЛист) и регистры сведений (для хранения истории показаний спидометра и норм расхода).
При этом все стандартные документы бухгалтерии (такие как Документ.ТребованиеНакладная или Документ.ПоступлениеТоваровУслуг) остаются на полной поддержке. При автоматическом обновлении через интернет или файлы обновлений 1С обновит типовые объекты без каких-либо конфликтов, а наши добавленные объекты просто перенесутся в новую версию конфигурации.
Если в старых версиях платформы (например, 8.3.10) возможности расширений были сильно ограничены режимом совместимости, то в современных версиях 1С:Предприятие 8.3 расширения стали основным инструментом кастомизации.
Используя расширения конфигурации, мы можем вообще не менять правила поддержки основной конфигурации — она остается полностью на замке. Внутри расширения мы можем:
&Перед, &ПриятноеИзменение или &После.Рассмотрим пример, как программно перехватить проведение документа в расширении для формирования собственных движений по ГСМ. Создадим в расширении процедуру-последователь:
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
// Проверим, не заблокировано ли проведение другими механизмами
Если Отказ Тогда
Возврат;
КонецЕсли;
// Проверяем тип документа. Если это наш специализированный документ:
Если Метаданные.Документы.Имя() = "Расш1_ПутевойЛист" Тогда
РассчитатьИЗаписатьРасходТоплива(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
Использование расширений минимизирует риски при обновлении основной базы. Главное правило — следить за тем, чтобы типы заимствованных объектов (если вы ссылаетесь на типовые справочники вроде Справочники.Организации или Справочники.ФизическиеЛица) не претерпевали критических изменений в новых релизах от вендора.
Иногда требования безопасности или бизнес-процессы компании диктуют жесткие условия: диспетчеров, заполняющих путевые листы, категорически нельзя пускать в бухгалтерскую базу. В этом случае идеальным архитектурным решением станет создание отдельной специализированной конфигурации («Путевые листы» или мини-УАТ) и настройка интеграции.
Ранее для этих целей активно применялось COM-соединение. Посмотрим на классический пример подключения к внешней базе данных для выгрузки готовых проводок:
// Создание COM-соединения с внешней базой
ПараметрыПодключения = "File=""C:\DB\Waybills""; Usr=""Dispatcher""; Pwd=""123"";";
V83Connector = Новый COMОбъект("V83.COMConnector");
Попытка
БазаПутевыхЛистов = V83Connector.Connect(ПараметрыПодключения);
Исключение
Сообщить("Не удалось подключиться к внешней базе: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Запрос данных из внешней базы по путевым листам
ВыборкаДанных = БазаПутевыхЛистов.NewObject("Запрос");
ВыборкаДанных.Текст =
"ВЫБРАТЬ
| ПутевойЛист.Ссылка КАК Ссылка,
| ПутевойЛист.РасходПоНорме КАК Расход
|ИЗ
| Документ.ПутевойЛист КАК ПутевойЛист
|ГДЕ
| ПутевойЛист.Проведен И НЕ ПутевойЛист.Выгружен";
// Обработка данных и формирование проводок в БП 3.0
// ...
Важное примечание: В современных реалиях, особенно при использовании серверов на базе Linux и облачных технологий, использование COM-соединения считается устаревшим подходом. Вместо него настоятельно рекомендуется использовать обмен данными через HTTP-сервисы. Это позволяет передавать данные в универсальном формате JSON, работает значительно быстрее и стабильнее.
Если доработки минимальны (например, нужно просто хранить пару дополнительных полей в типовом документе Требование-накладная, таких как «Номер путевого листа» и «Показания одометра»), изменять конфигурацию вообще не требуется.
Для этого воспользуемся штатным механизмом Библиотеки стандартных подсистем (БСП), встроенным в «1С:Бухгалтерию 3.0»:
Число).При таком подходе база данных остается абсолютно типовой, а автообновление будет проходить в штатном режиме без единой задержки.
Каким бы из вариантов хранения данных вы ни воспользовались, в итоге вам потребуется отразить списание ГСМ в бухгалтерском учете. Чтобы не изменять логику проведения стандартных документов (например, документов списания материалов), рекомендуется программно генерировать документ ОперацияБух (Операция, введенная вручную).
Проанализируем пример кода, создающего такую операцию на основе рассчитанных данных по путевому листу:
// Создание документа ручной операции
НоваяОперация = Документы.ОперацияБух.СоздатьДокумент();
НоваяОперация.Дата = КонецДня(ДатаПутевогоЛиста);
НоваяОперация.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", ИННКомпании);
НоваяОперация.Содержание = "Списание ГСМ по путевому листу № " + НомерЛиста;
НоваяОперация.Записать();
// Формирование проводок по регистру бухгалтерии
РегистрПроводок = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
РегистрПроводок.Отбор.Регистратор.Установить(НоваяОперация.Ссылка);
НоваяПроводка = РегистрПроводок.Добавить();
НоваяПроводка.Регистратор = НоваяОперация.Ссылка;
НоваяПроводка.Период = НоваяОперация.Дата;
НоваяПроводка.Организация = НоваяОперация.Организация;
// Дебет счета учета затрат (например, 20.01 - Основное производство)
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01");
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "НоменклатурныеГруппы", НоменклатурнаяГруппа);
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "СтатьиЗатрат", СтатьяЗатратГСМ);
// Кредит счета учета материалов (10.03 - Топливо)
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.03");
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетКт, НоваяПроводка.СубконтоКт, "Номенклатура", НоменклатураГСМ);
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетКт, НоваяПроводка.СубконтоКт, "Склады", ОсновнойСклад);
// Установка суммовых показателей
НоваяПроводка.Сумма = РассчитаннаяСуммаСписания;
НоваяПроводка.КоличествоКт = РасходПоНорме;
// Запись набора проводок в базу данных
РегистрПроводок.Записать();
Данный метод безопасен, так как документ ОперацияБух является стандартным и его структура не меняется от релиза к релизу, что гарантирует стабильную работу алгоритма проведения после любых обновлений конфигурации.
Для того чтобы сделать правильный выбор, оцените масштаб вашей задачи: