Возможно проблема кэширования 1с
parcan
28.04.2009 - 13:45
|
Поднимал уже такую тему на infostart.ru попробую и тут. . С ЧЕГО НАЧАЛАСЬ ТЕМА . Попытаюсь понятно сформулировать свою ситуацию: Общее: На точках стоит программа написанная на 1с (написана мною, код знаю как свои 5 пальцев). Продавец запускает программу (это один процесс) в которой осуществляет продажи. Первый процесс при старте запускает второй (фоновый) процесс 1с, который периодически отправляет данные с точки в офис и подгружает данные из офиса. Используется файловый вариант работы 1с. На точках используются 2 релиза платформы 8.1.12.98 и 8.1.13.37. Все действия производимые обоими процессами программы подробно пишутся в лог-файлы и логи соответственно присылаются ко мне. Существует документ смена, который создается пустой (заполнены только номер и дата) при открытии смены в магазине. Вечером продавец делает закрытие смены и этот документ перезаписывается с заполненными данными. Далее фоновый процесс отправляет данные этого документа в офис. Каждый объект имеет реквизит статус типа перечисления в котором хранится текущий статус объекта (не выгружен, выгружен в офис, загружен в офисе, отклонен в офисе) фоновый процесс ориентируется по этим статусам что ему делать. Проблема: Периодически на различных точках фоновый процесс при выгрузке документа как будто получает старую версию документа в которой еще не заполнены данные. Попытаюсь провести объяснение последовательности происходящих событий по своему логу с пояснениями: . Утром продавец открывает смену, записан документ смена с заполненными датой и номером, все остальные реквизиты пустые. 22.04.2009 8:37:51 kassir Открыта смена : Смена 16 от 22.04.2009 8:37:51 . Вечером продавец закрывает смену, перезаписан документ с заполненными параметрами, тут привожу только ДатаЗакрытия. 22.04.2009 22:33:47 kassir (до записи объекта) Документ объект: Смена Номер: 16 Дата: 22.04.2009 8:37:51 ДатаЗакрытия: 22.04.2009 22:33:47 22.04.2009 22:33:47 kassir Закрыта смена : Смена 16 от 22.04.2009 8:37:51 22.04.2009 22:33:47 kassir (после записи объекта) Документ объект: Смена Номер: 16 Дата: 22.04.2009 8:37:51 ДатаЗакрытия: 22.04.2009 22:33:47 . Далее робот (фоновый процесс) выполняет запрос документов смена в которых реквизит ДатаЗакрытия <> Дата(1,1,1) и по полученным ссылкам выгружает данные. 22.04.2009 22:33:49 robot (при выгрузке) Документ ссылка: Смена Номер: 16 Дата: 22.04.2009 8:37:51 ДатаЗакрытия: 01.01.0001 0:00:00 Получается, что при выполнении запроса у документа смена реквизит ДатаЗакрытия заполнен, а вот в полученной ссылке из запроса этот реквизит уже не заполнен (как впрочем и все остальные). При выгрузке документа фоновый процесс robot вновь перезаписывает документ меняя ему статус на выгружен. В итоге оказывается записан документ со статусом выгружен, но с пустыми реквизитами. . Далее может оказаться еще интереснее. Продавец печатает отчет за последнюю смену. Через МенеджерДокументов получаем ссылку на последний документ и выводим его данные 22.04.2009 22:34:00 kassir Напечатана строка: ДАТА ОТКР.: 22.04.2009 08:37:51 22.04.2009 22:34:00 kassir Напечатана строка: ДАТА ЗАКР.: 22.04.2009 22:33:47 Получается, что у продавца в документе данные все еще заполнены, но так бывает редко, обычно после робота и у продавца документ уже тоже имеет пустые данные. . В результате после всего этого в базе остался документ с незаполненными реквизитами. Закономерности этой проблемы выявить не смог, может несколько дней на всех точках работать все нормально, а потом на некоторых происходить такой косяк. При перезаписи объекта стал использовать Получить() ничего не изменилось. Код промониторил вдоль и поперек все выполняется четко. Операции выводимые в лог длятся меньше секунды, т.е. их последовательность точно не нарушена. . Единственное оставшееся у меня предположение, что это как то связано с кэшированием данных либо самой 1с либо системы в целом. . ЧЕМ ЗАКОНЧИЛАСЬ ТЕМА . После обсуждения был еще более детализирован лог и добавлена подписка на событие ПриЗаписи() для документа Смена. . В итоге событие ПриЗаписи() никогда не отрабатывает лишний раз и нет никакого обнуления документа Смена. . Но интересен лог для следующего кода в фоновом процессе робота //********************************************* Процедура ОбработатьПродажи(ТолькоНовые=Истина) МассивСтатусов = Новый Массив; МассивСтатусов.Добавить(Перечисления.СтатусыФайловогоОбмена.ПустаяСсылка()); МассивСтатусов.Добавить(Перечисления.СтатусыФайловогоОбмена.Создан); Если Не ТолькоНовые Тогда //выгруженные МассивСтатусов.Добавить(Перечисления.СтатусыФайловогоОбмена.Выгружен); КонецЕсли; Запрос = Новый Запрос("ВЫБРАТЬ | Смена.Ссылка КАК Ссылка |ИЗ | Документ.Смена КАК Смена |ГДЕ | Смена.ДатаЗакрытия <> &ПустаяДата | И Смена.Статус В(&СтатусыФайловогоОбмена) |УПОРЯДОЧИТЬ ПО | Смена.Дата" |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Чек.Ссылка КАК Ссылка |ИЗ | Документ.Чек КАК Чек |ГДЕ | Чек.Статус В(&СтатусыФайловогоОбмена) | |УПОРЯДОЧИТЬ ПО | Чек.Дата |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВнесениеИзъятие.Ссылка КАК Ссылка |ИЗ | Документ.ВнесениеИзъятие КАК ВнесениеИзъятие |ГДЕ | ВнесениеИзъятие.Статус В(&СтатусыФайловогоОбмена) | |УПОРЯДОЧИТЬ ПО | ВнесениеИзъятие.Дата"); Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1)); Запрос.УстановитьПараметр("СтатусыФайловогоОбмена", МассивСтатусов); МассивРезультатов = Запрос.ВыполнитьПакет(); МассивСмен = МассивРезультатов[0].Выгрузить().ВыгрузитьКолонку("Ссылка"); МассивЧеков = МассивРезультатов[1].Выгрузить().ВыгрузитьКолонку("Ссылка"); МассивВнесенийИзъятий = МассивРезультатов[2].Выгрузить().ВыгрузитьКолонку("Ссылка"); Для Каждого Смена Из МассивСмен Цикл _Временный._ВывестиВЛогДанныеСмены(Смена, "(результат запроса робота)"); КонецЦикла; СформироватьПродажи(МассивСмен, МассивЧеков, МассивВнесенийИзъятий); КонецПроцедуры // ОбработатьПродажи() //********************************************* . В _Временный._ВывестиВЛогДанныеСмены(ОбъектИлиСсылка, Описание) происходит только запись в лог-файл и ничего более. . Данные из лог-файла: 27.04.2009 22:31:02 robot (результат запроса робота) Документ ссылка: Смена Номер: 2 Дата: 27.04.2009 7:59:56 ДатаЗакрытия: 01.01.0001 0:00:00 . При выполнении запроса ДатаЗакрытия заполнена сразу после выполнения запроса ДатаЗакрытия пустая. Никаких изменений объекта Смена в это время не происходит, т.е. подписка на событие ПриЗаписи() не отрабатывает (в подписке на событие для логирования тоже вызываеться _Временный._ВывестиВЛогДанныеСмены(Источник, "(подписка на событие)")) . По всему набору имеющихся лог-файлов с проблемами выяснил что от времени выполнения запроса в процессе робота и сохранения смены в процессе продавца это не зависит, т.е. разница во времени составляла от 0 секунд до почти 4х минут во всем промежутке этого времени косяк может произойти, а может не произойти. На данный момент вероятность появления косяка варьируется в пределах 0-20%. . в общем волшебство :) |