Разработчики и внедренцы отраслевых решений от компании «1С-Рарус» (в частности, популярного продукта «1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК») регулярно сталкиваются со специфической логикой работы механизмов начисления и установки тарифов. Наиболее острой проблемой является возникновение ошибок дублирования записей в регистрах сведений при попытке изменить тариф или отменить его действие.
В этой статье мы подробно разберем внутреннюю архитектуру регистра сведений КВП_Тарифы, проанализируем причины сбоев при проведении документов установки тарифов, рассмотрим особенности системы лицензирования СЛК и покажем, как исправить типичные ошибки проектирования в данном программном продукте.
Сформулируем основные проблемы, с которыми сталкиваются пользователи и программисты 1С, и разберем пути их совместного решения.
Для начала проанализируем структуру хранения информации о тарифах. В конфигурации «1С:ЖКХ» сведения о действующих тарифах хранятся в периодическом регистре сведений КВП_Тарифы. Измерениями этого регистра являются:
ОрганизацияУслугаОбъект (Здание или Помещение)ВидТарифаРесурсом выступает непосредственно числовое значение — Тариф. Проблема заключается в том, что при изменении тарифа в один и тот же день система часто пытается записать новую строку, которая конфликтует с уже существующими записями по ключевым измерениям.
Рассмотрим стандартный блок формирования движений в документе УстановкаТарифов:
Для Каждого ТекОбъект Из СписокОбъектов Цикл
Движение = Движения.КВП_Тарифы.Добавить();
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.Услуга = Услуга;
Движение.Объект = ?(ТекОбъект.Помещение.Пустая(), ТекОбъект.Здание, ТекОбъект.Помещение);
Движение.ВидТарифа = ТекВидТарифа.ВидТарифа;
Движение.Тариф = ТекВидТарифа.Тариф;
Движение.Действует = Истина;
КонецЦикла;
Обратите внимание: если в табличной части документа присутствуют дублирующиеся строки по зданиям или помещениям, платформа 1С выдаст ошибку СУБД о неуникальности записей регистра. В типовых конфигурациях 1С уникальность проверяется перед записью на уровне платформы, но разработчики Раруса отключили автоматическую свертку табличной части. Посмотрим на закомментированный код в модуле проведения:
// Свертка ТЧ отключена, пока проверка уникальности выполняется средствами платформы
// при записи данных в регистр сведений.
//Если СписокОбъектов.Количество() > 0 Тогда
// Если (ВидОперации = Перечисления.УПЖКХ_ВидыОперацийУстановкиТарифов.УстановкаТарифа И УстанавливатьНаОбъекты)
// ИЛИ (ВидОперации = Перечисления.УПЖКХ_ВидыОперацийУстановкиТарифов.ОтменаТарифа И НЕ УстанавливатьНаОбъекты) Тогда
// СписокОбъектов.Свернуть("Здание, Помещение");
// Иначе
// СписокОбъектов.Очистить();
// КонецЕсли;
//КонецЕсли;
Решение проблемы с дублями: Чтобы избежать фатальных ошибок при проведении документа, нам необходимо раскомментировать или переписать этот блок кода, обеспечив принудительную свертку таблицы СписокОбъектов по ключевым колонкам (здание и помещение) перед началом цикла формирования движений. Также крайне важно обучить конечных пользователей не вводить несколько документов установки тарифов по одной организации и услуге на одну и ту же дату.
Если пользователи сначала отменили тариф (например, документом от прошлых периодов), а затем пытаются провести установку нового тарифа без учета хронологии, система также выдаст ошибку. В таком случае необходимо проанализировать историю записей в регистре КВП_Тарифы с помощью консоли запросов и устранить временные накладки.
Что касается неинтуитивной отмены тарифов, когда программа требует проводить документ отмены строго датой первоначальной установки: рекомендуется использовать штатные механизмы прекращения действия тарифа через создание нового документа с флагом прекращения начисления, четко контролируя дату начала действия изменений.
Большинство отраслевых решений Рарус защищены с помощью Системы лицензирования и защиты конфигураций (СЛК). Значительная часть расчетных механизмов (включая функции распределения услуг ЖКХ, расчет ОДН и пени) вынесена в закрытые двоичные данные или внешние библиотеки, которые невозможно отладить стандартными средствами конфигуратора 1С.
Это накладывает жесткие ограничения на доработку и диагностику:
15201 или 9099. Убедитесь, что данные порты открыты на сервере приложений 1С и брандмауэр не блокирует к ним доступ.Проблемы с качеством кода встречаются и в смежных конфигурациях, таких как «1С:Управление автотранспортом» (УАТ) или 1С:TMS. Примером может служить невнимательное использование переменных при копировании участков кода (копипаст). Рассмотрим фрагмент кода, где из-за банальной опечатки в имени переменной программа совершает двойное присвоение одной и той же переменной, игнорируя расстояние:
Если мсвПункты.Количество() Тогда
ПробегСГрузом = мсвПуктны[0].Расстояние; // Здесь опечатка в имени переменной: мсвПуктны вместо мсвПункты
ПробегСГрузом = мсвПуктны[0].Время; // В итоге переменная ПробегСГрузом перезаписывается временем!
КонецЕсли;
Такие ситуации требуют от программиста 1С регулярного проведения синтаксического контроля при обновлении конфигураций и оперативного исправления подобных ошибок во внешних модулях или расширениях конфигурации.
Еще одна классическая ошибка связана с обработкой импорта оплат из банков. Программа сохраняет путь к папке загрузки в системных настройках пользователя. Если пользователь физически удалил эту папку на диске, при повторном открытии обработка завершается критической ошибкой платформы и вообще не открывается.
Чтобы исправить это поведение, необходимо обернуть вызов проверки существования каталога в защищенный блок Попытка... Исключение в модуле формы обработки:
ПутьККаталогу = ВосстановитьЗначение("ПутьЗагрузкиРеестра");
Если ЗначениеЗаполнено(ПутьККаталогу) Тогда
Попытка
КаталогФайлов = Новый Файл(ПутьККаталогу);
Если НЕ КаталогФайлов.Существует() Тогда
Предупреждение("Сохраненный каталог импорта более не существует. Выберите новый путь.");
ПутьККаталогу = "";
КонецЕсли;
Исключение
// Обработка непредвиденных ошибок файловой системы
ПутьККаталогу = "";
КонецПопытки;
КонецЕсли;
Данный подход гарантирует стабильность работы интерфейса, даже если внешняя папка обмена была очищена или удалена администратором сети.
Учитывая высокую динамику изменений в требованиях Минстроя РФ, форматы обмена с ГИС ЖКХ постоянно меняются. Программные продукты Раруса требуют регулярной установки обновлений для поддержания интеграции в актуальном состоянии.
Для получения своевременных патчей и исправлений описанных выше ошибок требуется наличие активной подписки «1С:КП Отраслевой». Рекомендуем своевременно обновлять конфигурацию на тестовых базах, проверять корректность сопоставления ФИАС-адресов в справочниках зданий и помещений, так как малейшие расхождения в уникальных идентификаторах приводят к отклонению выгружаемых пакетов со стороны портала ГИС ЖКХ.