Имя: Пароль:
1C
1С v8
Непонятные глюки в запросе к документам
0 kostyan29
 
15.08.22
09:53
Внезапно вспомнил одну старую проблему и решил спросить.
1С УТ 11. Конкретную версию платформы и конфигурации не помню, потому что это было достаточно давно. Работали несколько удаленных магазинов, в одной общей базе.
Выполнялся запрос к документу.
Запрос простейший, буквально вида

ВЫБРАТЬ
   докТовары.Номенклатура
ИЗ
   Документ.КрасныеЦены.Товары КАК докТовары
ГДЕ
   докТовары.Ссылка.Проведен
   и докТовары.Номенклатура В (&массивНоменклатуры)

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

Суть в том, что большую часть времени все работало правильно. НО, иногда, запрос работал некорректно. К примеру, в документ красных цен добавили новую номенклатуру, записали, провели. А в магазине этого не видят - строчка с этим товаром не выделяется цветом, скидка с нее не сбрасывается. Напомню, работа в одной базе - никаких обменов. Если в этот момент закрыть программу и заново открыть - то сразу же после этого запрос отрабатывает корректно, возвращает все, в т.ч. и новую добавленную номенклатуру.
Или в офисе уберут какой-то товар из документа красных цен - а в магазине он упорно продолжает выделять цветом и сбрасывать скидки. Открываешь у себя - тот же самый товар не выделяется цветом, т.е. все нормально. Перезапустит магазин программу - и у них все нормально становится.
Причем это буквально три-четыре раза проявилось - т.е. в остальных случаях корректно все отрабатывало. Экспериментировали - специально меняли что-то в документе, через секунду проверяли в магазине - изменения корректно отображались. Т.е. в большинстве случаев все корректно, только изредка происходило нечто непонятное, в результате чего запрос возвращал не те данные. Собственно, отловить это именно мне, т.е. чтобы в консоли запустить запрос, проверить - вообще ни разу не удалось. Это только магазинам так "везло".
После перевода документа на проведение в регистр сведений и запрос к регистру проблемы ушли. Больше ни разу ничего подобного не было за почти два года.
Есть большие подозрения на то, что документ кэшировался и данные брались из кэша.
Собственно, так ли это? Такое поведение вообще нормальным было? Я читал про обычный и транзакционный кэш, но никогда с ним не было проблем, кроме этого случая с запросом к документу.
Можно еще какие-то подобные сюрпризы ожидать от 1С? В справочниках, еще где-то? Не знаю, к примеру - изменили название номенклатуры, а в другом запущенном сеансе будет показываться старое, пока 20 минут не пройдут, и обычный кэш не очистится? И можно ли эти кэши чистить, в оперативной памяти?
1 Кир Пластелинин
 
15.08.22
10:03
так а запрос откуда выполнялся? может из модуля с повторным использованием значений)
2 Фрэнки
 
15.08.22
10:03
А на файловой версии базы такой глюк не пытались словить?
Напрашивается подозрение, что это эффект от вида СУБД, когда одна версионник, а другая блокировочник
3 Dmitrii
 
гуру
15.08.22
10:06
С 99%-ной вероятностью никакого глюка не было. Просто кто-то менял документ КрасныеЦены.
Узнать это можно только, если включено версионирование этого документа.

Либо использование модулей с повторным использованием возвращаемых значений https://its.1c.ru/db/v8std/content/724/hdoc
4 kostyan29
 
15.08.22
10:18
(1) из общего модуля, где повторное использование возвр. значений "НЕ использовать"
(2) база MS SQL. На файловой не пытались, т.к. он проявлялся редко и непредсказуемо. Наверно, можно было неделю сидеть, тыкаться - и ничего не словить.
(3) Нет, дело не в изменении документа. Как минимум один раз (может и больше, не помню) точно удалось словить такое, что я под своим пользователем захожу - у меня все правильно. Магазин в тот же самый момент (по удаленке зашел к ним и смотрю) - у них некорректная информация. Сам перезапускаю у них программу - и все, волшебным образом у них тоже все правильно.
5 Кир Пластелинин
 
15.08.22
10:35
(4) запрос то в какой момент отрабатывает?
6 Смотрящий
 
15.08.22
10:37
Кеш ?
7 Dmitrii
 
гуру
15.08.22
10:37
(4) >> ... и все, волшебным образом у них тоже все правильно.

Животрепещущая история конечно. Но ничего не доказывающая.
Чудес не бывает.
Возможных причин не так уж и много.
1. Кто-то третий всё-таки правил документ КрасныеЦены, пока вы с магазином пытались моделировать глюк.
2. Запрос возвращает правильные данные, а ошибка в коде, отвечающем за раскрашивание номенклатуры или ещё где-то по пути от запроса до отображения информации.
3. Где-то всё таки применяется опция общих модулей с повторным использованием возвращаемых значений. Может не в том самом модуле, где запрос выполняется, а в другом в цепочке стека вызовов.

А вариант "глюк СУБД" я лично рассматривал бы в самую последнюю очередь.
8 kostyan29
 
15.08.22
10:47
(5) Смотрели на раскрашивании строк. Динамический список в допиленной форме Чека ККМ  ФормаДокументаРМК. Событие ПриПолученииДанныхНаСервере. Оттуда вызов общего модуля, который ничего повторно не возвращает.
(6) Возможно. На него и думал. Но дело до конца не довел, т.к. все решилось другим путем.
(7) Я и не думаю про глюк СУБД (MS SQL Server). Я грешу на какое-нибудь хитрое кэширование 1С, которое такое "О-па! А мы уже недавно обращались к этому объекту, зачем нам его тягать из БД, давайте я вам его из кэша в оперативной памяти отдам".
9 Кир Пластелинин
 
15.08.22
10:54
(8) чет я хз как тут можно притянуть объектный кэш. да и он вроде версию объекта учитывает, так что при изменении перечитается
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс