Как организовать хранение и использование списка счетов в 1С 7.7

Программист 1С v7.7 Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Вариант 1. Использование справочника (классический метод)

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

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

Для использования этого списка в запросе Бухгалтерских Итогов (БИ), нам необходимо выгрузить его в СписокЗначений. Разберем пример кода:


СписокДляБИ = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.СпискиСчетов");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если Спр.ЭтоГруппа = 0 Тогда
        СписокДляБИ.ДобавитьЗначение(Спр.Счет);
    КонецЕсли;
КонецЦикла;
// Теперь используем в БИ
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ИспользоватьСубконто(,, 1);
БИ.ВыполнитьЗапрос(ДатаНач, ДатаКон, СписокДляБИ);

Вариант 2. Хранение в константе через сериализацию (ЗначениеВСтрокуВнутр)

Если мы хотим избежать создания лишних справочников и нам нужен один глобальный список, можно воспользоваться механизмом сериализации. Платформа 7.7 позволяет превратить любой сложный объект, включая СписокЗначений, в строку и сохранить его в константу неограниченной длины.

Рассмотрим, как это работает. Сначала создадим сервисную обработку, в которой администратор сформирует список, а затем сохраним его:


// Сохранение списка в константу
ТекСписок = СоздатьОбъект("СписокЗначений");
// ... заполнение списка счетами ...
Константа.НастройкаСчетовЗатрат = ЗначениеВСтрокуВнутр(ТекСписок);

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


// Восстановление списка в отчете
СписокСчетов = ЗначениеИзСтрокиВнутр(Константа.НастройкаСчетовЗатрат);

Вариант 3. Внешние файлы (.lst или .txt)

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

Разберем по шагам, как организовать загрузку из файла в каталоге информационной базы:


ПутьКФайлу = КаталогИБ() + "settings_accounts.lst";
СписокСчетов = СоздатьОбъект("СписокЗначений");
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
    СписокСчетов.Загрузить(ПутьКФайлу);
Иначе
    Предупреждение("Файл настроек не найден!");
КонецЕсли;

Если необходимо разделять настройки по пользователям, используем КаталогПользователя() вместо КаталогИБ(). Это позволит каждому бухгалтеру иметь свой набор "любимых" счетов для формирования отчетов.

Вариант 4. Оптимизация через Глобальный модуль (Кэширование)

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

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

В Глобальном модуле пишем:


Переменная глСписокСпецСчетов Экспорт;

Функция глПолучитьСписокСчетов() Экспорт
    Если ТипЗначенияСтр(глСписокСпецСчетов) <> "СписокЗначений" Тогда
        глСписокСпецСчетов = СоздатьОбъект("СписокЗначений");
        // Загружаем из справочника или константы
        // ... код загрузки ...
    КонецЕсли;
    Возврат глСписокСпецСчетов;
КонецФункции

Теперь в любом отчете вместо десяти строк кода загрузки мы будем использовать всего одну:

НужныеСчета = глПолучитьСписокСчетов();

Вариант 5. Использование масок и групп счетов

Часто не обязательно перечислять каждый субсчет (10.1, 10.2, 10.3 и т.д.). Рассмотрим способ упрощения администрирования через родительские счета. В 1С 7.7 при использовании бухгалтерских итогов можно включить выборку по субсчетам автоматически.

Если мы добавим в наш список только счет-родитель (например, счет 10), то в коде запроса БИ мы можем указать необходимость включения всех вложенных счетов:


БИ = СоздатьОбъект("БухгалтерскиеИтоги");
// 1 в третьем параметре означает "Включать субсчета"
БИ.ИспользоватьСчет(СчетПоКоду("10"), 1); 

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

Резюме по выбору решения

Подведем итоги нашего анализа:

  1. Справочник — лучшее решение для обеспечения целостности данных и удобства пользователя.
  2. Константа + ЗначениеВСтрокуВнутр — самый быстрый способ с технической точки зрения.
  3. Файлы .lst — подходят для переноса настроек между базами или личных настроек.
  4. Глобальный модуль — обязателен для исключения дублирования кода в разных отчетах.

Выяснив все нюансы, мы рекомендуем комбинированный подход: хранение в справочнике (для удобства редактирования) с кэшированием в глобальной переменной при запуске системы или первом обращении.

← На главную