Галка "Отбор" для вида субконто.

Автор Харлампий Дымба, 02 декабря 2024, 23:30

« назад - далее »

Харлампий Дымба

Пару слов о галке "Отбор" для вида субконто:
Посмотрел на неё, поискал в сети - ничего не нашёл, подумал: "хуже не будет", поставил и сломал несколько нужных отчетов, напоровшись на давно забытый баг. Пришлось разбираться.
Может кому пригодится.
DBF 7.70.027

Итак, галка отбора проводок по субконто устанавливается для каждого вида субонто отдельно в меню "Свойства - Дополнительные - Отбор".
Под эти отборы целиком предназначена таблица 1SSBSEL "Отбор проводок по субконто". Если  ни у одного вида субконто не установлен галка "Отбор", то таблица будет пуста. Таблица содержит только два индекса - список проводок ENTRY и список значений субконто в проводках VALUE. При установке отбора какому-либо виду субконто добавления новых индексов не происходит, просто в таблице 1SSBSEL.dbf и в индексе VALUE {SBKINDID,VAL,DATE,TIME,DOCID,NUMBER,CORNO}
добавляются записи для вида субконто SBKINDID, которому устновлен отбор. Поэтому файл 1SSBSEL.DBF растет умеренно, его размер и размер индексного файл 1SSBSEL.CDХ при установке галок для всех проводок будет сравним с размером файла 1SACCSEL "Отбор Счетов" при стандартной установке отбора проводок: "Разрешить отбор - Для всех". При установке/снятии галки выполняется пересчет таблицы 1SSBSEL и зачем-то 1SACCSEL.
Таблица 1SSBSEL вспомогательная, может быть уничтожена и восстановлена через ТиИ - Пересчет служебных данных.

Значение галки можно узнать через Метаданные.ВидыСубконто(ХХХ).Сортировка: 1 - есть отбор проводок по значению субконто, 0 - нет.

Значимого замедления записи проводок при установленном отборе проводок по субконто не происходит.
Таким образом, можно пренебречь рекомендацией ИТС ставить отбор только для тех видов субконто, где это необходимо, а проставить для всех субконто. Но следует учесть, что если число значений какого-либо вида субконто мало, то прибавка скорости будет незначительна: например, для перечислений.

Установка отбора никак не влияет на методы ИспользоватьСубконто() и ИспользоватьКорСубконто() объекта "Операция" и соответственно выборки проводок с помощью метода .ВыбратьОперацииСПроводками().
Установка отбора никак не влияет на расчет временных итогов методом .Рассчитать() и установку периода получения бухгалтерских итогов методами .ПериодД(), .ПериодКВ(), .ПериодКВН(), .ПериодМ(), .ПериодМНК(), .ПериодМНГ() и на последующее получение итогов.
Установка отбора никак не влияет на работу метода .ВыполнитьЗапрос() объекта "Запрос".

Установка отбора позволяет интерактивно выбрать проводки по конкретному значению субконто в журнале проводок через меню "Действия - Отбор по значению - Отобрать"

Установка отбора используется методами ИспользоватьСубконто() и ИспользоватьКорСубконто() объекта "Бухгалтерские итоги" и соответственно позволяет ускорить получение итогов методом .ВыполнитьЗапрос(). Оценка скорости - выполнение запроса по одному элементу большого справочника: с установленным отбором - 1, без отбора - 500. В то же время для справочника, содержащего всего один элемент,  разницы в скорости нет. Аналогично для перечислений - чем больше и чем разнообразнее используемые значения - тем больше ускорение. Но работает и в обратную сторону - если в проводках используется только одно значение перечисления, то установленный отбор может даже немного замедлять получение итогов. Ускорение же достигается когда значение отбора в ИспользоватьСубконто() или ИспользоватьКорСубконто() - конкретное значение (но не группа справочника) или небольшой, до 1000, список значений (но не содержащий группы справочника). В случае фильтра по группе справочника отбор не используется и не зависит от количества элементов в группе. В случае фильтра по пустому значению отбор не используется, независимо от установленного запрета / разрешения на ввод пустых субконто ("Свойства - Настройки - Ввод пустых субконто").
Работа отбора не зависит от параметров метода .ВыполнитьЗапрос() - в том числе от <ТипИтогов> и <Периодичность>.

В SQL-версии ИТС рекомендует не пользоваться отбором - прибавки не видно (_1SSBSEL вообще не используется?), а ресурсы на поддержание отбора расходуются. Если, конечно, не нужен интерактивный отбор проводок.

В типовой бухагалтерии отбор используется для видов субконто "Контрагенты" (быстрое получение долга по контрагенту / зачёт аванса) и субконто "Номенклатура" (остаток по конкретному товару).

Крайне не рекомендуется использовать метод .ИспользоватьКорСубконто() со списком значений при установленном отборе (см. баг 2).

Баг 1: при объединенении конфигурации изменение состояния галки "Отбор" игнорируется, и, если других изменений нет, будет выдано сообщение "Конфигурации идентичны!!!"
Обход:
Вариант 1. При накатывании изменений проставить нужное состояние непосредственно в изменяемой конфигурации.
Вариант 2. ?Изменить что-то из других бух.реквизитов?
Замечание 1: обмена при УРБД данный баг не касается - на переферийную базу встанет корректная конифигурация и будет произведен необходимый пересчет служебных данных.
Замечание 2: "Виды субконто" вообще как-то обделили - с заданным на закладке  "Свойства - Представление" нестандартным представлением субконто есть похожий кривопофиксенный баг.

Баг 2: Если установлена галка "Отбор", то в режиме запроса перестаёт работать метод ИспользоватьКорСубконто() объекта "Бухгалтерские итоги" с отбором по списку значений.
БИ=СоздатьОбъект("БухгалтерскиеИтоги"); 
БИ.ИспользоватьКорСубконто(ВидыСубконто.Контрагенты,СписокКонтрагентов,2);
БИ.ВыполнитьЗапрос(Дата1,Дата2,"41","60",,2);//неверная пустая выборка

БИ=СоздатьОбъект("БухгалтерскиеИтоги"); 
БИ.ИспользоватьСубконто(ВидыСубконто.Контрагенты,СписокКонтрагентов,2);
БИ.ВыполнитьЗапрос(Дата1,Дата2,"60","41",,2);//верная выборка
Такая ошибка метода ИспользоватьКорСубконто(<ВидСубконто>,<Субконто>,<ТипФильтра>,<ПоГруппам>) наблюдается при соблюдении следующих условий:
для <ВидСубконто> установлена галка отбора "Свойства - Дополнительные - Отбор";
<Субконто> - непустой список значений соответствующего типа, не содержащий групп справочника.
<ТипФильтра> "1 - разворачивать по данному субконто" или "2 - отбирать по данному субконто".
Обход:
Вариант 1. Поменять местами счет и корсчет, чтобы можно было применить метод ИспользоватьСубконто() вместо ИспользоватьКорСубконто().
Вариант 2. Не использовать отбор по списку значений, а фильтровать данные уже после выполнения запроса к бухгалтерским итогам.

Резюме:
Стоит поставить галку "Отбор" по видам субконто: справочники и документы в DBF-версии.
Необходимо исключить использование метода .ИспользоватьКорСубконто() объекта "Бухагалтерские Итоги" со списком значений для тех видов субконто, которым установлен отбор.