Обмен заканчивается без предупреждений в окне "Предупреждения при синхронизации данных"
но если заглянуть в журнал регистрации то там их много.
Проверила эти документы: все с ними хорошо, и проведены (хотя в предупреждении пишет что не удалось провести). И док-основание проведен и все (кажется) норм заполнено там.
Текст такой:
Не удалось провести документ Счет-фактура полученный 2080-001025 от 29.03.2019 15:38:44, полученный из другой информационной базы. По причине Некорректно заполнена колонка "Документ-основание" в строке 1 списка "Документы-основания счета-фактуры".
Документ не проведен. Счет-фактуру можно провести только на основании проведенного документа..
Возможно не заполнены все реквизиты, обязательные к заполнению.
Синхронизация УНФ - БП.
УНФ старая правила очень переписанные.
Эти предупреждения (странные) посыпались после последнего обновления и как бы с данными все хорошо (вроде бы) но ведь непорядок...
Наведите на мысль: с чего такое может вдруг быть? Где искать баг?
ВЫБРАТЬ
&РТУ КАК Документ,
ВЫРАЗИТЬ(&РТУ КАК Документ.РеализацияТоваровУслуг).МоментВремени КАК МоментВремени
ОБЪЕДИНИТЬ
ВЫБРАТЬ
&СчетФактура,
ВЫРАЗИТЬ(&СчетФактура КАК Документ.СчетФактураВыданный).МоментВремени
УПОРЯДОЧИТЬ ПО
МоментВремени УБЫВ
Показать
Увы Счет фактура раньше при одинаковом времени.
Варианты
1. Самое простое.В ПКО прибавлять секунду, если Даты равны и поиск только по УИДу. Использовать обязательно функцию Мин(Источник.ДокументОснование.Дата+1 , КонецДня(Источник.ДокументОснование.Дата))
2.Вариант муторный. Определить свой порядок проведения. В ПКО добавить Параметр Порядок, В глобальный обработчик "После загрузки объекта" добавлять Объект в таблицу значений и проводить в После загрузки данных
Пример
Если ИмяТипаОбъекта = "Документ" и не ПараметрыОбъекта = Неопределено и не ПараметрыОбъекта["Порядок"] = Неопределено Тогда
Если НЕ Параметры.Свойство("ТаблицаДокументов") Тогда
Параметры.Вставить("ТаблицаДокументов",Новый ТаблицаЗначений);
Параметры.ТаблицаДокументов.Колонки.Добавить("Порядок",Новый ОписаниеТипов("Число"));
Параметры.ТаблицаДокументов.Колонки.Добавить("Объект");
КонецЕсли;
НоваяСтрока = Параметры.ТаблицаДокументов.Добавить();
НоваяСтрока.Порядок = ПараметрыОбъекта["Порядок"];
НоваяСтрока.Объект = Объект;
КонецЕсли;
Проверьте проводки и движения по регистрам после обмена и после ручного проведения, чтобы убедиться, что данные хорошо загрузились.
Если все ок, то смотреть (2).
(4)Смотрела проводки и движения. Одинаковые.
из этого:
1. Счет фактура проводится раньше
2. Документ основание указан в шапке, а не табличной части ДокументыОснования
проверила №2 ДокументОснование есть и в шапке и в табл части ДокументыОснования
Подскажите, как проверить №1 время у них одинаковое до секунды
ВЫБРАТЬ
&РТУ КАК Документ,
ВЫРАЗИТЬ(&РТУ КАК Документ.РеализацияТоваровУслуг).МоментВремени КАК МоментВремени
ОБЪЕДИНИТЬ
ВЫБРАТЬ
&СчетФактура,
ВЫРАЗИТЬ(&СчетФактура КАК Документ.СчетФактураВыданный).МоментВремени
УПОРЯДОЧИТЬ ПО
МоментВремени УБЫВ
Показать
Увы Счет фактура раньше при одинаковом времени.
Варианты
1. Самое простое.В ПКО прибавлять секунду, если Даты равны и поиск только по УИДу. Использовать обязательно функцию Мин(Источник.ДокументОснование.Дата+1 , КонецДня(Источник.ДокументОснование.Дата))
2.Вариант муторный. Определить свой порядок проведения. В ПКО добавить Параметр Порядок, В глобальный обработчик "После загрузки объекта" добавлять Объект в таблицу значений и проводить в После загрузки данных
Пример
Если ИмяТипаОбъекта = "Документ" и не ПараметрыОбъекта = Неопределено и не ПараметрыОбъекта["Порядок"] = Неопределено Тогда
Если НЕ Параметры.Свойство("ТаблицаДокументов") Тогда
Параметры.Вставить("ТаблицаДокументов",Новый ТаблицаЗначений);
Параметры.ТаблицаДокументов.Колонки.Добавить("Порядок",Новый ОписаниеТипов("Число"));
Параметры.ТаблицаДокументов.Колонки.Добавить("Объект");
КонецЕсли;
НоваяСтрока = Параметры.ТаблицаДокументов.Добавить();
НоваяСтрока.Порядок = ПараметрыОбъекта["Порядок"];
НоваяСтрока.Объект = Объект;
КонецЕсли;
(11) На самом деле. При проведении Реализации перепроводится и счет фактура. То есть. Провелась Счет фактура - заругалась, провелась накладная - все встало на свои места. Помогут варианты в (12) А может быть Хватит в ПКО счета фактуры Перед выгрузкой или Перед загрузкой прописать РежимЗаписи = "Запись"
(15) Мой учебник это шишки набитые с 2005 года и внимательное чтение Информации по обработчикам. Здесь много хороших статей. Вчера например промелькнула дельная статья Кстати. Установки Режима записи в Запись достаточно. Счет фактура не будет проводится, а свойство Проведен в истина заставит Реализацию провести счет фактуру
В модуле объекта КонвертацияОбъектовИнформационныхБаз
в процедуре Процедура ВыполнитьОтложенноеПроведениеДокументов()
Если Объект.ПроверитьЗаполнение() Тогда
// При проведении документа снимаем запрет на выполнение ПРО,
// т.к. ПРО были проигнорированы при обычной записи документа с целью оптимизации скорости загрузки данных.
Если Объект.ДополнительныеСвойства.Свойство("ОтключитьМеханизмРегистрацииОбъектов") Тогда
Объект.ДополнительныеСвойства.Удалить("ОтключитьМеханизмРегистрацииОбъектов");
КонецЕсли;
ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения();
Объект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
// Выполняем попытку проведения документа.
Объект.Записать(РежимЗаписиДокумента.Проведение);
ДокументПроведенУспешно = Объект.Проведен;
Иначе
//Видана+ мое доп предупреждение
ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Объект, УзелОбменаЗагрузкаДанных, "Моя ошибка!!! ", Истина);
//=
ДокументПроведенУспешно = Ложь;
КонецЕсли;
Показать
А этот Объект.ПроверитьЗаполнение() вызывает
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
из модуля объекта документа СчетФактураПолученный
и ней в том числе такой фрагмент:
Для каждого СтрокаТЧ Из ДокументыОснования Цикл
Если ЗначениеЗаполнено(СтрокаТЧ.ДокументОснование)
И ТипЗнч(СтрокаТЧ.ДокументОснование) <> Тип("ДокументСсылка.ДокументРасчетовСКонтрагентом")
И ТипЗнч(СтрокаТЧ.ДокументОснование) <> Тип("ДокументСсылка.ОтчетКомитентуОПродажах")
И НЕ СтрокаТЧ.ДокументОснование.Проведен Тогда
ТекстСообщения = НСтр("ru = 'Документ не проведен. Счет-фактуру можно провести только на основании проведенного документа.'");
ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения(
"Колонка",
"Корректность",
"Документ-основание",
СтрокаТЧ.НомерСтроки,
"Документы-основания счета-фактуры",
ТекстСообщения);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,, "НадписьДокументыОснования",, Отказ);
КонецЕсли;
КонецЦикла;
Показать
и это и есть текст предупреждений которые мне не нравятся.
те эту СФполуч таки пытаются провести при непроведенном ДокументеОсновании
(13)Наверное у меня какая-то другая причина или не пойму...
Проверяла запросом порядок моментов времени, на которые только что получила предупреждения = все хорошо, момент у счет-фактуры позже.
Но ведь то что моменты позже из этого не следует что их не проводили раньше?
Добавляла
РежимЗаписи = "Запись" в ПКО ПередЗагрузкой.
И ничего не изменилось, все то же самое. Пробовала даже РежимЗаписи = "ОтменаПроведения"
Уже думаю может действительно там что-то не то 1 строкой ДокументовОснований
(17)Прошу прощения. Я Вас ввел в заблуждение с секундами. Все таки 12 пункт 2. На самом деле не критично, счет фактура все равно проводится правильно, если верить типовым правилам и конфигурациям. Но все таки скиньте файл правил. Поправлю. Мне так проще
(18)Похоже все таки секунды?
Смотрю ту жеобработку КонвертацияОбъектовИнформационныхБаз:
Процедура ВыполнитьОтложенноеПроведениеДокументов()
Если ДокументыДляОтложенногоПроведения().Количество() = 0 Тогда
Возврат // нет документов в очереди
КонецЕсли;
// Сворачиваем таблицу по уникальным полям.
ДокументыДляОтложенногоПроведения().Свернуть("ДокументСсылка, ДатаДокумента");
// Сортируем документы по возрастанию даты документов.
ДокументыДляОтложенногоПроведения().Сортировать("ДатаДокумента");
Как то натолкнула на мысль экспортная функция ДокументыДляОтложенногоПроведения(). Этож можно использовать в После загрузки данных!
Добавить Колонку Порядок, пробежаться Счет фактуре присвоить порядок выше, отсортировать,
Процедуру ВыполнитьОтложенноеПроведениеДокументов помещаем в алгоритмы. Чуть подшаманим с сортировкой по Дате и Порядку, остальное без изменений.
А в обработчике После загрузки данных пишем
//Проверим, что обмен идет из обработки КонвертацияОбъектовИнформационныхБаз, а не через универсальную
Если Метаданные().Имя = "КонвертацияОбъектовИнформационныхБаз" Тогда
ДокументыДляОтложенногоПроведения().Колонки.Добавить("Порядок",Новый ОписаниеТипов("Число"));
Для Каждого Стр из ДокументыДляОтложенногоПроведения() Цикл
Если ТипЗнч(Стр.ДокументСсылка) = Тип("ДокументСписок.СчетФактураВыданный") Тогда
стр.Порядок = 10;
КонецЕсли;
КонецЦикла;
Выполнить(Алгоритмы.ВыполнитьОтложенноеПроведениеДокументов);
//Отложенное проведение уже выполнили, очистим
ДокументыДляОтложенногоПроведения().Очистить();
КонецЕсли;
(18)Уменьшила время ПК в базе источнике и наладилось.
в 12 №1 = верное решение!
Вот нет, что бы раньше попробовать. Стыдно перед работодателем столько времени на такую фигню тратить.
Как думаете лучше в правилах время править или в базе источнике при создании (например)?
На скрине это я уже своих предупреждения выводила, чтобы порядок проведения видеть.
Как думаете лучше в правилах время править или в базе источнике при создании (например)?
В базе? А зачем лишнее телодвижение со временем? Есть смысл, когда проведение не оперативное, а приход позже расхода в одну секунду.
Но. Мне сейчас нравиться мое же решение в (23). Возьму себе на вооружение. Хотя он и повторяет мой же алгоритм, но не до списали граждане из 1С. Двоешники:)
Проверьте авансы на всякий случай и даты связанных документов, а еще попробуйте распровести и провести еще раз какой-нибудь документ.
Ошибок при обмене не должно быть.