(8) А в какой именно строке? Просмотрела всю процедуру, не могу понять.
Процедура ЗаполнитьОперативныеВзаиморасчеты(ОсновныеПараметры) Экспорт
#Область ИнициализацияЗапросаИПеременных
АналитикаУчетаПоПартнерам = ОсновныеПараметры.АналитикаУчетаПоПартнерам;
ОбъектРасчетов = ОсновныеПараметры.ОбъектРасчетов;
ВалютаРасчетов = ОсновныеПараметры.ВалютаРасчетов;
ЭтоРасчетыСКлиентами = ОсновныеПараметры.ЭтоРасчетыСКлиентами;
Регистратор = ОсновныеПараметры.Регистратор;
Порядок = ОсновныеПараметры.Порядок;
ВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
ВалютаУправленческогоУчета = Константы.ВалютаУправленческогоУчета.Получить();
АналитикаОбъектаРасчета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(АналитикаУчетаПоПартнерам,»Организация»);
Организация = АналитикаОбъектаРасчета.Организация;
//Если график исполнения в договоре, то вместо графика заказа будет уточняться график договора.
//Если пользователь каким-то образом ввел заказы с графиками по такому договору, то все этапы таких заказов будут отнесены к графику договора
//и закрываться будут по ФИФО независимо от привязки накладных к заказам
Если ТипЗнч(ОбъектРасчетов) = Тип(«СправочникСсылка.ДоговорыКонтрагентов») Тогда
ГрафикИсполненияДоговора = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектРасчетов,»ГрафикИсполненияДоговора»);
ГрафикВДоговоре = ЗначениеЗаполнено(ГрафикИсполненияДоговора);
Иначе
ГрафикИсполненияДоговора = Неопределено;
ГрафикВДоговоре = ЛОЖЬ;
КонецЕсли;
Если ЭтоРасчетыСКлиентами Тогда
РасчетыПоЗаказу = ТипЗнч(ОбъектРасчетов) = Тип(«ДокументСсылка.ЗаказКлиента»)
ИЛИ ТипЗнч(ОбъектРасчетов) = Тип(«ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента»);
Иначе
РасчетыПоЗаказу = ТипЗнч(ОбъектРасчетов) = Тип(«ДокументСсылка.ЗаказПоставщику»);
КонецЕсли;
СписокТиповПлатежек = ТипыПлатежныхДокументов();
РасчетыПоПлатежке = СписокТиповПлатежек.Найти(ТипЗнч(ОбъектРасчетов)) <> Неопределено;
ХозяйственныеОперацииНеОтгрузка = ХозяйственныеОперацииНеОтгрузка();
Если НЕ РасчетыПоПлатежке И ТипЗнч(ОбъектРасчетов) = Тип(«ДокументСсылка.ПервичныйДокумент») Тогда
ТипПервичногоДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектРасчетов,»ТипПервичногоДокумента»);
РасчетыПоПлатежке = ТипПервичногоДокумента = Перечисления.ТипыПервичныхДокументов.ОплатаПоставщику
ИЛИ ТипПервичногоДокумента = Перечисления.ТипыПервичныхДокументов.ОплатаОтКлиента;
КонецЕсли;
ГлобальныеПеременные = Новый Структура;
ГлобальныеПеременные.Вставить(«ЕжедневнаяПереоценка», Константы.ПереоцениватьВалютныеСредстваПоДням.Получить());
//Для уточнения плана оплат — в переменной хранится последний момент времени плана оплат,
//чтобы при добавлении записи в план оплат можно было сразу определить есть ли планы оплат с датой больше, чем добавляемая запись.
ГлобальныеПеременные.Вставить(«МаксимальныйПорядокПланаОплат»,»»);
ГлобальныеПеременные.Вставить(«ВалютаРасчетов», ВалютаРасчетов);
ГлобальныеПеременные.Вставить(«ГрафикВДоговоре», ГрафикВДоговоре);
ГлобальныеПеременные.Вставить(«ЭтоРасчетыСКлиентами», ЭтоРасчетыСКлиентами);
ГлобальныеПеременные.Вставить(«ПорядокПереоценки», Новый Соответствие);
//Хозяйственные операции для заполнения.
ХозяйственныеОперации = Новый Соответствие;
Если ЭтоРасчетыСКлиентами Тогда
ХозяйственныеОперации.Вставить(«ЗачетАванса», Перечисления.ХозяйственныеОперации.ЗачетАвансаКлиента);
ХозяйственныеОперации.Вставить(«ПогашениеЗадолженности», Перечисления.ХозяйственныеОперации.ПогашениеЗадолженностиКлиента);
ХозяйственныеОперации.Вставить(«ВозвратАванса», Перечисления.ХозяйственныеОперации.ВозвратОплатыКлиенту);
ХозяйственныеОперации.Вставить(«ПереоценкаПоложительная», Перечисления.ХозяйственныеОперации.КурсовыеРазницыКлиентыПрибыль);
ХозяйственныеОперации.Вставить(«ПереоценкаОтрицательная», Перечисления.ХозяйственныеОперации.КурсовыеРазницыКлиентыУбыток);
ХозяйственныеОперации.Вставить(«Планирование», Перечисления.ХозяйственныеОперации.ПланированиеПоЗаказуКлиента);
Иначе
ХозяйственныеОперации.Вставить(«ЗачетАванса», Перечисления.ХозяйственныеОперации.ЗачетАвансаПоставщику);
ХозяйственныеОперации.Вставить(«ПогашениеЗадолженности», Перечисления.ХозяйственныеОперации.ПогашениеЗадолженностиПоставщику);
ХозяйственныеОперации.Вставить(«ВозвратАванса», Перечисления.ХозяйственныеОперации.ВозвратДенежныхСредствОтПоставщика);
ХозяйственныеОперации.Вставить(«ПереоценкаПоложительная», Перечисления.ХозяйственныеОперации.КурсовыеРазницыПоставщикиУбыток);
ХозяйственныеОперации.Вставить(«ПереоценкаОтрицательная», Перечисления.ХозяйственныеОперации.КурсовыеРазницыПоставщикиПрибыль);
ХозяйственныеОперации.Вставить(«Планирование», Перечисления.ХозяйственныеОперации.ПланированиеПоЗаказуПоставщику);
КонецЕсли;
ХозяйственныеОперации.Вставить(«ПереносАванса», Перечисления.ХозяйственныеОперации.ПереносАванса);
ГлобальныеПеременные.Вставить(«ХозяйственныеОперации», ХозяйственныеОперации);
Запрос = Новый Запрос;
Менеджер = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = Менеджер;
Запрос.УстановитьПараметр(«ОбъектРасчетов», ОбъектРасчетов);
Запрос.УстановитьПараметр(«АналитикаУчетаПоПартнерам», АналитикаУчетаПоПартнерам);
Запрос.УстановитьПараметр(«Организация», Организация);
Запрос.УстановитьПараметр(«ВалютаУпр», ВалютаУправленческогоУчета);
Запрос.УстановитьПараметр(«ВалютаРегл», ВалютаРегламентированногоУчета);
Запрос.УстановитьПараметр(«СписокТиповЗаказов», СписокТиповРегистраторовПланов());
Запрос.УстановитьПараметр(«ВалютаРасчетов», ВалютаРасчетов);
Запрос.УстановитьПараметр(«Порядок», Порядок);
Запрос.УстановитьПараметр(«ГрафикВДоговоре», ГрафикВДоговоре);
Запрос.УстановитьПараметр(«ГрафикИсполненияДоговора», ГрафикИсполненияДоговора);
Запрос.УстановитьПараметр(«РасчетыПоЗаказу», РасчетыПоЗаказу);
Запрос.УстановитьПараметр(«ЭтоРасчетыСКлиентами», ЭтоРасчетыСКлиентами);
Запрос.УстановитьПараметр(«Регистратор», Регистратор);
Запрос.УстановитьПараметр(«ПорядокЗачетаПоДатеПлатежа», Константы.ПорядокЗачетаДокументовПоДатеОперации.Получить() = 1);
#КонецОбласти
#Область ИнициализацияНаборовЗаписей
Если ЭтоРасчетыСКлиентами Тогда
НаборЗаписейПоСрокам = РегистрыНакопления.РасчетыСКлиентамиПоСрокам.СоздатьНаборЗаписей();
НаборЗаписейПланОплат = РегистрыНакопления.РасчетыСКлиентамиПланОплат.СоздатьНаборЗаписей();
НаборЗаписейПланОтгрузокПоставок = РегистрыНакопления.РасчетыСКлиентамиПланОтгрузок.СоздатьНаборЗаписей();
Иначе
НаборЗаписейПоСрокам = РегистрыНакопления.РасчетыСПоставщикамиПоСрокам.СоздатьНаборЗаписей();
НаборЗаписейПланОплат = РегистрыНакопления.РасчетыСПоставщикамиПланОплат.СоздатьНаборЗаписей();
НаборЗаписейПланОтгрузокПоставок = РегистрыНакопления.РасчетыСПоставщикамиПланПоставок.СоздатьНаборЗаписей();
КонецЕсли;
Если ОсновныеПараметры.Свойство(«ДополнительныеСвойстваПроведения») И ОсновныеПараметры.ДополнительныеСвойстваПроведения <> Неопределено Тогда
НаборЗаписейПоСрокам.ДополнительныеСвойства.Вставить(«ПроверятьИзмененияРегистра», Истина);
Если ОсновныеПараметры.Свойство(«Регистратор») Тогда
// При изменении проведения документа будут изменения в регистре, но по ним не следует регистрировать документ к отражению,
// так как он в любом случае изменит свои данные отражения при проведении (или распроведении).
НаборЗаписейПоСрокам.ДополнительныеСвойства.Вставить(«НеотражаемыйДокумент», ОсновныеПараметры.Регистратор);
КонецЕсли;
КонецЕсли;
РегистраторРасчетовОбъект = РегистраторРасчетов(ОбъектРасчетов, АналитикаУчетаПоПартнерам, ВалютаРасчетов, ЭтоРасчетыСКлиентами, Организация);
РегистраторРасчетов = РегистраторРасчетовОбъект.Ссылка;
НаборЗаписейПоСрокам.Отбор.Регистратор.Установить(РегистраторРасчетов);
НаборЗаписейПланОплат.Отбор.Регистратор.Установить(РегистраторРасчетов);
НаборЗаписейПланОтгрузокПоставок.Отбор.Регистратор.Установить(РегистраторРасчетов);
#КонецОбласти
//Движения до начала пересчета и остатки.
СформироватьВТДанныхРегистровДоНачалаРасчетов(Запрос, ЭтоРасчетыСКлиентами);
//Данные регистров с порядком меньше порядка начала расчета, далее дополняются.
ТаблицаРасчетовПоСрокам = Менеджер.Таблицы[«ВТРасчетыПоСрокамДо»].ПолучитьДанные().Выгрузить();
ТаблицаПланОплат = Менеджер.Таблицы[«ВТРасчетыПланОплатДо»].ПолучитьДанные().Выгрузить();
ТаблицаПланОтгрузокПоставок = Менеджер.Таблицы[«ВТРасчетыПланОтгрузокПоставокДо»].ПолучитьДанные().Выгрузить();
//Движения после начала пересчета и остатки до начала пересчета для распределения.
РасчетыОтгрузкиПоставки = ПолучитьОтгрузкиПоставки(Запрос, Порядок);
ПланыОплат = ПолучитьПланыОплат(Запрос, Порядок, ЭтоРасчетыСКлиентами);
ПланыОтгрузокПоставок = ПолучитьПланыОтгрузокПоставок(Запрос, Порядок, ЭтоРасчетыСКлиентами);
РасчетыОплаты = ПолучитьОплаты(Запрос, Порядок);
Если РасчетыОплаты.Количество() = 0 И РасчетыОтгрузкиПоставки.Количество() = 0 И ТаблицаРасчетовПоСрокам.Количество() = 0 И НЕ ОсновныеПараметры.ТолькоПланы Тогда
НаборЗаписейПоСрокам.Записать();
КонецЕсли;
Если ПланыОплат.Количество() = 0 И РасчетыОтгрузкиПоставки.Количество() = 0 И ТаблицаПланОплат.Количество() = 0 Тогда
НаборЗаписейПланОплат.Записать();
КонецЕсли;
Если ПланыОтгрузокПоставок.Количество() = 0 И ТаблицаПланОтгрузокПоставок.Количество() = 0 Тогда
НаборЗаписейПланОтгрузокПоставок.Записать();
КонецЕсли;
НужнаПереоценка = (ВалютаРасчетов <> ВалютаРегламентированногоУчета ИЛИ ВалютаРасчетов <> ВалютаУправленческогоУчета)
И РасчетыОтгрузкиПоставки.Количество() > 0
И НЕ ОсновныеПараметры.ТолькоПланы;
Если НужнаПереоценка Тогда
ДатаНачалаКурсов = Мин(РасчетыОтгрузкиПоставки[0].Период,
?(РасчетыОплаты.Количество() > 0,
РасчетыОплаты[0].Период,
РасчетыОтгрузкиПоставки[0].Период));
ТаблицаКурсовВалют = ПолучитьКурсыВалют(Запрос, ДатаНачалаКурсов, ГлобальныеПеременные);
ГлобальныеПеременные.Вставить(«ТаблицаКурсовВалют», ТаблицаКурсовВалют);
КонецЕсли;
ДокументыРасчетаКурсовыхРазниц = Документы.РасчетКурсовыхРазниц.ДокументыПереоценки(Организация,
?(РасчетыОтгрузкиПоставки.Количество() > 0, РасчетыОтгрузкиПоставки[0].ДатаВозникновения, ТекущаяДатаСеанса()),
ТекущаяДатаСеанса(),
ЭтоРасчетыСКлиентами);
ГлобальныеПеременные.Вставить(«ДокументыРасчетаКурсовыхРазниц», ДокументыРасчетаКурсовыхРазниц);
//Добавляем приходные записи по плану оплаты (заказы , график договора)
//накладные не добавляем, т.к они могут быть уменьшены авансами.
Для Каждого Стр Из ПланыОплат Цикл
Если НЕ Стр.ПриходДобавлен Тогда
НовСтр = ТаблицаПланОплат.Добавить();
НовСтр.ВидДвижения = ВидДвиженияНакопления.Приход;
НовСтр.ДокументРегистратор = Стр.Регистратор;
НовСтр.ДокументПлан = Стр.Регистратор;
НовСтр.ВариантОплаты = Стр.ВариантОплаты;
НовСтр.Период = Стр.Период;
НовСтр.ДатаВозникновения = Стр.ДатаВозникновения;
НовСтр.ДатаПлановогоПогашения = Стр.ДатаПлановогоПогашения;
НовСтр.КОплате = Стр.КОплате;
НовСтр.ПорядокОперации = Стр.ПорядокОперации;
НовСтр.ПорядокЗачета = Стр.ПорядокОперации;
НовСтр.ХозяйственнаяОперация = ГлобальныеПеременные.ХозяйственныеОперации[«Планирование»];
КонецЕсли;
КонецЦикла;
//Добавляем приходные записи планов отгрузок.
Для Каждого Стр Из ПланыОтгрузокПоставок Цикл
Если НЕ Стр.ПриходДобавлен Тогда
НовСтр = ТаблицаПланОтгрузокПоставок.Добавить();
НовСтр.ВидДвижения = ВидДвиженияНакопления.Приход;
НовСтр.ДокументРегистратор = Стр.Регистратор;
НовСтр.ДокументПлан = Стр.Регистратор;
НовСтр.Период = Стр.Период;
НовСтр.ДатаВозникновения = Стр.ДатаВозникновения;
НовСтр.ДатаПлановогоПогашения = Стр.ДатаПлановогоПогашения;
НовСтр.Сумма = Стр.КОтгрузкеПоставке;
НовСтр.ПорядокЗачета = Стр.ПорядокОперации;
НовСтр.ПорядокОперации = Стр.ПорядокОперации;
КонецЕсли;
КонецЦикла;
//Для определения курса корректировки реализации в минус.
//Ключ — ДокументСсылка.РеализациТоваровУслуг, ДокументСсылка.АктВыполненныхРабот
//Значение — Структура
// * СуммаДокумента, СуммаДокументаРегл, СуммаДокументаУпр — нужны для определения среднего курса реализации при проведении корректировок.
ДанныеНакладных = Новый Соответствие;
ТаблицаДанныхНакладных = ПолучитьДанныеНакладных(Запрос);
Для Каждого Строка Из ТаблицаДанныхНакладных Цикл
ДанныеНакладных.Вставить(Строка.Накладная,
СтруктураСумм(Строка.Сумма,
Строка.СуммаРегл,
Строка.СуммаУпр));
КонецЦикла;
ГлобальныеПеременные.Вставить(«ДанныеНакладных», ДанныеНакладных);
ЗаписейОплаты = РасчетыОплаты.Количество();
ЗаписейОтгрузкиПоставки = РасчетыОтгрузкиПоставки.Количество();
ЗаписейОбработать = ЗаписейОплаты + ЗаписейОтгрузкиПоставки;
Индексы = Новый Структура;
//Индекс текущей обрабатываемой строки отгрузок.
Индексы.Вставить(«ИндексОтгрузкиПоставки», 0);
//Индекс текущей обрабатываемой строки оплат.
Индексы.Вставить(«ИндексОплаты», 0);
//Для распределения копеек в рамках документа.
ТекущийДокументОплаты = Неопределено;
ТекущийДокументОтгрузкиПоставки = Неопределено;
//Сколько строк отгрузки пропущено для зачета корректировкой реализации.
ПропускОтгрузкиПоставки = 0;
Пока Индексы.ИндексОплаты + Индексы.ИндексОтгрузкиПоставки < ЗаписейОбработать Цикл
Если Индексы.ИндексОплаты <= ЗаписейОплаты — 1 И Индексы.ИндексОтгрузкиПоставки <= ЗаписейОтгрузкиПоставки — 1 Тогда
СтрокаОплаты = РасчетыОплаты[Индексы.ИндексОплаты];
СтрокаОтгрузкиПоставки = РасчетыОтгрузкиПоставки[Индексы.ИндексОтгрузкиПоставки];
//Оплата раньше отгрузки.
Если СтрокаОплаты.ПорядокОперации < СтрокаОтгрузкиПоставки.ПорядокОперации
//В пределах регистратора (при расчетах по накладным) должен происходить зачет аванса.
ИЛИ СтрокаОплаты.Регистратор = СтрокаОтгрузкиПоставки.Регистратор Тогда
//Переброс аванса на расчетный документ — накладную.
НеОтгрузка = ХозяйственныеОперацииНеОтгрузка.Найти(СтрокаОтгрузкиПоставки.ХозяйственнаяОперация) <> Неопределено;
ДвойнаяЗаписьНеНужна = НеОтгрузка
//Если расчеты по платежке, то эти движения уже отражены в оперативных расчетах в рамках переноса с одного объекта расчетов на другой.
ИЛИ РасчетыПоПлатежке;
//Приход предоплаты.
Если НЕ СтрокаОплаты.ПриходДобавлен Тогда
ПересчитатьСуммыЕслиЭтоКорректировка(ГлобальныеПеременные, СтрокаОплаты);
ДобавитьПриход(ГлобальныеПеременные, ТаблицаРасчетовПоСрокам, СтрокаОплаты, «Оплата»);
КонецЕсли;
//Уменьшаем план отгрузки, если есть.
Если НЕ СтрокаОтгрузкиПоставки.ПланОтгрузокПоставокСписан Тогда
СписатьПланОтгрузкиПоставки(ГлобальныеПеременные, ТаблицаПланОтгрузокПоставок, СтрокаОтгрузкиПоставки, ПланыОтгрузокПоставок);
КонецЕсли;
Если СтрокаОтгрузкиПоставки.Сумма <> 0 Тогда
Если ТекущийДокументОплаты <> СтрокаОплаты.РасчетныйДокумент Тогда
ПредоплатаРаспределеноРегл = 0;
ПредоплатаРаспределеноУпр = 0;
ТекущийДокументОплаты = СтрокаОплаты.РасчетныйДокумент;
КонецЕсли;
Если ТекущийДокументОтгрузкиПоставки <> СтрокаОтгрузкиПоставки.РасчетныйДокумент Тогда
ДолгРаспределеноРегл = 0;
ДолгРаспределеноУпр = 0;
ТекущийДокументОтгрузкиПоставки = СтрокаОтгрузкиПоставки.РасчетныйДокумент;
КонецЕсли;
//Добавляем запись списания предоплаты.
НовСтр_Предоплата_Расход = ТаблицаРасчетовПоСрокам.Добавить();
НовСтр_Предоплата_Расход.ВидДвижения = ВидДвиженияНакопления.Расход;
НовСтр_Предоплата_Расход.ДокументРегистратор = СтрокаОтгрузкиПоставки.Регистратор;
НовСтр_Предоплата_Расход.ВалютаДокумента = СтрокаОтгрузкиПоставки.ВалютаДокумента;
НовСтр_Предоплата_Расход.Период = СтрокаОтгрузкиПоставки.Период;
НовСтр_Предоплата_Расход.РасчетныйДокумент = СтрокаОплаты.РасчетныйДокумент;
НовСтр_Предоплата_Расход.ДатаВозникновения = СтрокаОплаты.ДатаВозникновения;
НовСтр_Предоплата_Расход.ДатаПлановогоПогашения = Дата(1,1,1);
НовСтр_Предоплата_Расход.ПорядокЗачета = СтрокаОплаты.ПорядокОперации;
НовСтр_Предоплата_Расход.ПорядокОперации = СтрокаОтгрузкиПоставки.ПорядокОперации;
НовСтр_Предоплата_Расход.СтатьяДвиженияДенежныхСредств = СтрокаОтгрузкиПоставки.СтатьяДвиженияДенежныхСредств;
НовСтр_Предоплата_Расход.КорОбъектРасчетов = СтрокаОплаты.КорОбъектРасчетов;
СуммаСписания = Мин(СтрокаОплаты.Сумма, СтрокаОтгрузкиПоставки.Сумма);
//Возврат аванса с ручным курсом отражаем по курсу возврата.
Если СтрокаОтгрузкиПоставки.ЭтоВозвратАванса И СтрокаОтгрузкиПоставки.РучнойКурсРегл Тогда
ПредоплатаРеглПредв = СтрокаОтгрузкиПоставки.СуммаРегл / СтрокаОтгрузкиПоставки.Сумма * СуммаСписания;
//Ошибки округления сразу зачитываем, если что они переоценятся.
ИначеЕсли СтрокаОтгрузкиПоставки.РучнойКурсРегл И СтрокаОтгрузкиПоставки.Сумма = СуммаСписания Тогда
ПредоплатаРеглПредв = СтрокаОтгрузкиПоставки.СуммаРегл;
//Остальные авансы по курсу аванса.
Иначе
ПредоплатаРеглПредв = СтрокаОплаты.СуммаРегл / СтрокаОплаты.Сумма * СуммаСписания;
КонецЕсли;
Если СтрокаОтгрузкиПоставки.ЭтоВозвратАванса И СтрокаОтгрузкиПоставки.РучнойКурсУпр Тогда
ПредоплатаУпрПредв = СтрокаОтгрузкиПоставки.СуммаУпр / СтрокаОтгрузкиПоставки.Сумма * СуммаСписания;
ИначеЕсли СтрокаОтгрузкиПоставки.РучнойКурсУпр И СтрокаОтгрузкиПоставки.Сумма = СуммаСписания Тогда
ПредоплатаУпрПредв = СтрокаОтгрузкиПоставки.СуммаУпр;
Иначе
ПредоплатаУпрПредв = СтрокаОплаты.СуммаУпр / СтрокаОплаты.Сумма * СуммаСписания;
КонецЕсли;
Если СтрокаОтгрузкиПоставки.ЭтоВозвратАванса Тогда
НовСтр_Предоплата_Расход.ХозяйственнаяОперация = ХозяйственныеОперации[«ВозвратАванса»];
ИначеЕсли РасчетыПоПлатежке И НЕ СтрокаОтгрузкиПоставки.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВзаимозачетЗадолженности Тогда
НовСтр_Предоплата_Расход.ХозяйственнаяОперация = ХозяйственныеОперации[«ПереносАванса»];
ИначеЕсли НеОтгрузка Тогда
НовСтр_Предоплата_Расход.ХозяйственнаяОперация = СтрокаОтгрузкиПоставки.ХозяйственнаяОперация;
Иначе
НовСтр_Предоплата_Расход.ХозяйственнаяОперация = ХозяйственныеОперации[«ЗачетАванса»];
КонецЕсли;
НовСтр_Предоплата_Расход.Предоплата = СуммаСписания;
НовСтр_Предоплата_Расход.ПредоплатаРегл = Окр(ПредоплатаРеглПредв + ПредоплатаРаспределеноРегл — Окр(ПредоплатаРаспределеноРегл, 2), 2);
НовСтр_Предоплата_Расход.ПредоплатаУпр = Окр(ПредоплатаУпрПредв + ПредоплатаРаспределеноУпр — Окр(ПредоплатаРаспределеноУпр, 2), 2);
ПредоплатаРаспределеноРегл = ПредоплатаРаспределеноРегл + ПредоплатаРеглПредв;
ПредоплатаРаспределеноУпр = ПредоплатаРаспределеноУпр + ПредоплатаУпрПредв;
//Уменьшаем строку оплаты на сумму зачета
СтрокаОплаты.Сумма = СтрокаОплаты.Сумма — НовСтр_Предоплата_Расход.Предоплата;
СтрокаОплаты.СуммаРегл = СтрокаОплаты.СуммаРегл — НовСтр_Предоплата_Расход.ПредоплатаРегл;
СтрокаОплаты.СуммаУпр = СтрокаОплаты.СуммаУпр — НовСтр_Предоплата_Расход.ПредоплатаУпр;
Если НЕ ДвойнаяЗаписьНеНужна Тогда
//Отражаем приход на сумму долга по курсу предоплаты.
НовСтр_Долг_Приход = ТаблицаРасчетовПоСрокам.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр_Долг_Приход, НовСтр_Предоплата_Расход , ,»Предоплата, ПредоплатаУпр, ПредоплатаРегл, КорОбъектРасчетов»);
НовСтр_Долг_Приход.ВидДвижения = ВидДвиженияНакопления.Приход;
НовСтр_Долг_Приход.Период = СтрокаОтгрузкиПоставки.Период;
НовСтр_Долг_Приход.ДатаВозникновения = СтрокаОтгрузкиПоставки.Период;
НовСтр_Долг_Приход.ДатаПлановогоПогашения = СтрокаОтгрузкиПоставки.ДатаПлановогоПогашения;
НовСтр_Долг_Приход.РасчетныйДокумент = СтрокаОтгрузкиПоставки.Регистратор;
НовСтр_Долг_Приход.ПорядокЗачета = СтрокаОтгрузкиПоставки.ПорядокЗачета;
НовСтр_Долг_Приход.ХозяйственнаяОперация = СтрокаОтгрузкиПоставки.ХозяйственнаяОперация;
НовСтр_Долг_Приход.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.ПустаяСсылка();
НовСтр_Долг_Приход.Долг = НовСтр_Предоплата_Расход.Предоплата;
Если СтрокаОтгрузкиПоставки.РучнойКурсУпр Тогда
НовСтр_Долг_Приход.ДолгУпр = СтрокаОтгрузкиПоставки.КурсУпр * СуммаСписания;
Иначе
НовСтр_Долг_Приход.ДолгУпр = НовСтр_Предоплата_Расход.ПредоплатаУпр;
КонецЕсли;
Если СтрокаОтгрузкиПоставки.РучнойКурсРегл Тогда
НовСтр_Долг_Приход.ДолгРегл = СтрокаОтгрузкиПоставки.КурсРегл * СуммаСписания;
Иначе
НовСтр_Долг_Приход.ДолгРегл = НовСтр_Предоплата_Расход.ПредоплатаРегл;
КонецЕсли;
//Переносим предоплату на расчетный документ отгрузки.
НовСтр_Долг_Расход = ТаблицаРасчетовПоСрокам.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр_Долг_Расход, НовСтр_Долг_Приход);
НовСтр_Долг_Расход.ВидДвижения = ВидДвиженияНакопления.Расход;
НовСтр_Долг_Расход.ХозяйственнаяОперация = ХозяйственныеОперации[«ЗачетАванса»];
НовСтр_Долг_Расход.ДатаПлановогоПогашения = СтрокаОтгрузкиПоставки.ДатаПлановогоПогашения;
НовСтр_Долг_Расход.РасчетныйДокумент = СтрокаОтгрузкиПоставки.Регистратор;
НовСтр_Долг_Расход.ДатаВозникновения = СтрокаОтгрузкиПоставки.Период;
НовСтр_Долг_Расход.ПорядокЗачета = СтрокаОтгрузкиПоставки.ПорядокЗачета;
НовСтр_Долг_Расход.ДокументРегистратор = СтрокаОтгрузкиПоставки.Регистратор;
НовСтр_Долг_Расход.СтатьяДвиженияДенежныхСредств = СтрокаОтгрузкиПоставки.СтатьяДвиженияДенежныхСредств;
НовСтр_Долг_Расход.Долг = НовСтр_Предоплата_Расход.Предоплата;
НовСтр_Долг_Расход.ДолгУпр = НовСтр_Предоплата_Расход.ПредоплатаУпр;
НовСтр_Долг_Расход.ДолгРегл = НовСтр_Предоплата_Расход.ПредоплатаРегл;
//Если курс переноса предоплаты и прихода по долгу не совпал, делаем переоценку.
//Возможно, когда и в оплате и в накладной ручные суммы в валюте регл. или упр. учета.
Если НовСтр_Долг_Приход.ДолгРегл <> НовСтр_Долг_Расход.ДолгРегл
ИЛИ НовСтр_Долг_Приход.ДолгУпр <> НовСтр_Долг_Расход.ДолгУпр Тогда
ДобавитьЗаписьПереоценки(ГлобальныеПеременные,
ТаблицаРасчетовПоСрокам,
СтрокаОтгрузкиПоставки.Период,
НовСтр_Долг_Приход,
«Долг»,
НовСтр_Долг_Расход.ДолгРегл — НовСтр_Долг_Приход.ДолгРегл,
НовСтр_Долг_Расход.ДолгУпр — НовСтр_Долг_Приход.ДолгУпр);
КонецЕсли;
КонецЕсли;
Если СтрокаОтгрузкиПоставки.РучнойКурсРегл И НЕ ДвойнаяЗаписьНеНужна Тогда
//Остаток должен быть уменьшен ровно на ту сумму, на которую уже сформирован приход в двойной записи.
ДолгРеглПредв = НовСтр_Долг_Приход.ДолгРегл;
Иначе
//Иначе пропорционально уменьшаем остаток строки.
ДолгРеглПредв = СтрокаОтгрузкиПоставки.КурсРегл * СуммаСписания;
КонецЕсли;
Если СтрокаОтгрузкиПоставки.РучнойКурсУпр И НЕ ДвойнаяЗаписьНеНужна Тогда
ДолгУпрПредв = НовСтр_Долг_Приход.ДолгУпр;
Иначе
ДолгУпрПредв = СтрокаОтгрузкиПоставки.КурсУпр * СуммаСписания;
КонецЕсли;
Если ГлобальныеПеременные.ДанныеНакладных[СтрокаОтгрузкиПоставки.Регистратор] = Неопределено Тогда
ГлобальныеПеременные.ДанныеНакладных.Вставить(СтрокаОтгрузкиПоставки.Регистратор, СтруктураСумм());
КонецЕсли;
СтрокаОтгрузкиПоставки.Сумма = СтрокаОтгрузкиПоставки.Сумма — СуммаСписания;
СтрокаОтгрузкиПоставки.СуммаРегл = СтрокаОтгрузкиПоставки.СуммаРегл — Окр(ДолгРеглПредв + ДолгРаспределеноРегл — Окр(ДолгРаспределеноРегл,2),2);
СтрокаОтгрузкиПоставки.СуммаУпр = СтрокаОтгрузкиПоставки.СуммаУпр — Окр(ДолгУпрПредв + ДолгРаспределеноУпр — Окр(ДолгРаспределеноУпр,2),2);
ДолгРаспределеноРегл = ДолгРаспределеноРегл + ДолгРеглПредв;
ДолгРаспределеноУпр = ДолгРаспределеноУпр + ДолгУпрПредв;
ДанныеНакладной = ГлобальныеПеременные.ДанныеНакладных[СтрокаОтгрузкиПоставки.Регистратор];
ДанныеНакладной.СуммаДокумента = ДанныеНакладной.СуммаДокумента + СуммаСписания;
ДанныеНакладной.СуммаДокументаРегл = ДанныеНакладной.СуммаДокументаРегл + НовСтр_Предоплата_Расход.ПредоплатаРегл; //-
ДанныеНакладной.СуммаДокументаУпр = ДанныеНакладной.СуммаДокументаУпр + НовСтр_Предоплата_Расход.ПредоплатаУпр;
//Уменьшаем график оплаты условной задолженности на разницу суммы зачтенного аванса и строк накладной сверх заказа.
СуммаУменьшенияГрафика = ВзаиморасчетыСервер.СписатьСумму(СуммаСписания, СтрокаОтгрузкиПоставки.КОплате);
Если СуммаСписания > 0 И НЕ СтрокаОплаты.ГрафикСписан Тогда
СкорректироватьПлановыеОплаты(ГлобальныеПеременные, ТаблицаПланОплат, СтрокаОплаты, СуммаСписания, «Аванс», ПланыОплат);
КонецЕсли;
Если СтрокаОплаты.Сумма = 0 Тогда
Индексы.ИндексОплаты = Индексы.ИндексОплаты + 1;
Если Окр(СтрокаОплаты.СуммаРегл, 2) <> 0 ИЛИ Окр(СтрокаОплаты.СуммаУпр, 2) <> 0 Тогда
ДобавитьЗаписьПереоценки(ГлобальныеПеременные, ТаблицаРасчетовПоСрокам, СтрокаОтгрузкиПоставки.Период,
СтрокаОплаты, «Предоплата», -Окр(СтрокаОплаты.СуммаРегл, 2), -Окр(СтрокаОплаты.СуммаУпр, 2));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрокаОтгрузкиПоставки.Сумма = 0 Тогда
Индексы.ИндексОтгрузкиПоставки = Индексы.ИндексОтгрузкиПоставки + 1;
Если СтрокаОтгрузкиПоставки.СуммаРегл <> 0 ИЛИ СтрокаОтгрузкиПоставки.СуммаУпр <> 0 Тогда
ДобавитьЗаписьПереоценки(ГлобальныеПеременные, ТаблицаРасчетовПоСрокам, НачалоДня(СтрокаОплаты.Период),
СтрокаОтгрузкиПоставки, «Долг», -Окр(СтрокаОтгрузкиПоставки.СуммаРегл, 2), -Окр(СтрокаОтгрузкиПоставки.СуммаУпр, 2));
КонецЕсли;
КонецЕсли;
//Отгрузка раньше оплаты.
Иначе
//Обычная оплата.
Если НЕ СтрокаОплаты.ЭтоКорректировка Тогда
//Добавляем строку прихода долга по отгрузке/поставке.
Если НЕ СтрокаОтгрузкиПоставки.ПриходДобавлен И СтрокаОтгрузкиПоставки.Сумма <> 0 Тогда
ПересчитатьСуммыЕслиЭтоКорректировка(ГлобальныеПеременные, СтрокаОтгрузкиПоставки);
ДобавитьПриход(ГлобальныеПеременные, ТаблицаРасчетовПоСрокам, СтрокаОтгрузкиПоставки, «ОтгрузкаПоставка»);
//Уточняется план только на сумму по заказу.
СкорректироватьПлановыеОплаты(ГлобальныеПеременные, ТаблицаПланОплат, СтрокаОтгрузкиПоставки, СтрокаОтгрузкиПоставки.Сумма — СтрокаОтгрузкиПоставки.КОплате, «УточнениеПлана»,ПланыОплат);
//Добавляются записи плана на всю сумму включая уточнение и сверхзаказа.
СкорректироватьПлановыеОплаты(ГлобальныеПеременные, ТаблицаПланОплат, СтрокаОтгрузкиПоставки, СтрокаОтгрузкиПоставки.Сумма, «ОтгрузкаПоставка», ПланыОплат);
КонецЕсли;
//Списываем план отгрузки если есть.
Если НЕ СтрокаОтгрузкиПоставки.ПланОтгрузокПоставокСписан Тогда
СписатьПланОтгрузкиПоставки(ГлобальныеПеременные, ТаблицаПланОтгрузокПоставок, СтрокаОтгрузкиПоставки, ПланыОтгрузокПоставок);
КонецЕсли;
Если СтрокаОтгрузкиПоставки.Сумма <> 0 Тогда
//Переоценка накладной до даты оплаты.
Если НужнаПереоценка Тогда
ПереоценитьДолг(ГлобальныеПеременные, ТаблицаРасчетовПоСрокам, СтрокаОтгрузкиПоставки, СтрокаОплаты);
КонецЕсли;
//Если расчетный документ накладная изменился, то сбрасываем служебные реквизиты распределения копеек.
Если ТекущийДокументОтгрузкиПоставки <> СтрокаОтгрузкиПоставки.РасчетныйДокумент Тогда
ДолгРаспределеноРегл = 0;
ДолгРаспределеноУпр = 0;
ТекущийДокументОтгрузкиПоставки = СтрокаОтгрузкиПоставки.РасчетныйДокумент;
КонецЕсли;
//Добавляем строку погашения задолженности.
НовСтр_Долг_Расход = ТаблицаРасчетовПоСрокам.Добавить();
НовСтр_Долг_Расход.ВидДвижения = ВидДвиженияНакопления.Расход;
НовСтр_Долг_Расход.ДокументРегистратор = СтрокаОплаты.Регистратор;
//Взаимозачет считаем взаимозачетом
Если СтрокаОплаты.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВзаимозачетЗадолженности Тогда
НовСтр_Долг_Расход.ХозяйственнаяОперация = СтрокаОплаты.ХозяйственнаяОперация;
Иначе
НовСтр_Долг_Расход.ХозяйственнаяОперация = ХозяйственныеОперации[«ПогашениеЗадолженности»];
КонецЕсли;
НовСтр_Долг_Расход.ВалютаДокумента = СтрокаОплаты.ВалютаДокумента;
НовСтр_Долг_Расход.Период = СтрокаОплаты.Период;
НовСтр_Долг_Расход.ПорядокОпера
Ошибка при вызове метода контекста (Записать) |
Я |
16.10.13 — 22:33
Доброго времени суток:
собственно принялся устранять дубли в Бухгалтерии 3.0 скачал обработку от сюда http://infostart.ru/public/14986/ все хорошо находит дубли находит ссылки но при попытке замены и записи документа начинает ругаться на Ошибка при вызове метода контекста (Записать), как это можно поправить?
Спасибо за внимание!
1 — 16.10.13 — 22:39
Собственно по коду:
Попытка
Параметры.Объект.Записать();
Исключение
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
Собственно происходит замена значения реквизита (дубликата) на правильное значение и после этого попытка записи измененного документа где:
Параметры — структура
Параметры.Объект — собственно ДокументОбъект
2 — 16.10.13 — 22:49
или посоветуйте достойную альтернативу, кроме сам напиши, время поджимает
3 — 16.10.13 — 23:15
Сообщить(ТипЗнч(Объект));
4 — 16.10.13 — 23:16
Ну или как там в УФ
5 — 16.10.13 — 23:19
(3) минутку
6 — 16.10.13 — 23:20
например:
Документ объект: Ввод начальных остатков
7 — 16.10.13 — 23:25
Период открыт?
8 — 16.10.13 — 23:25
Дата и номер отличны от других документов того же типа?
9 — 16.10.13 — 23:26
Объект.ОбменДанными.Загрузка = Истина?
10 — 16.10.13 — 23:27
11 — 16.10.13 — 23:27
(9) Истина
Отличны, в ручную (проставляя те же значения) все отлично перепроводится и сохраняется…
12 — 16.10.13 — 23:28
(10) искал уже…
13 — 16.10.13 — 23:32
Ну давай сюда свой код полностью
14 — 16.10.13 — 23:36
БылиИсключения = Ложь;
Если ВыполнятьВТранзакции Тогда
НачатьТранзакцию();
КонецЕсли;
ОбрабатываемаяСсылка = Неопределено;
Параметры = Новый Структура;
Параметры.Вставить(«Объект», Неопределено);
СтруктураКоллизий = Новый Структура;
ЕСли мФормаИндикатора<>Неопределено Тогда
мФормаИндикатора.МаксимальноеЗначение = ТаблицаСсылок.Количество();
мФормаИндикатора.КомментарийЗначения = «Выполняется замена элементов.» + ЗаголовокИндикации;
мФормаИндикатора.Значение = 0;
КонецЕсли;
Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
Ссылка = СтрокаТаблицы.Ссылка;
// **** надо вынести в корень
Заменяемые = Новый Соответствие;
Заменяемые.Вставить(Ссылка, ПравильныйЭлемент);
ОбработкаПрерыванияПользователя();
Сообщить(«Обрабатывается » + СтрокаТаблицы.Данные);
Если ОбрабатываемаяСсылка <> СтрокаТаблицы.Данные Тогда
Если Истина
И ОбрабатываемаяСсылка <> Неопределено
И Не ЛксЛиКлючЗаписиРегистра(ОбрабатываемаяСсылка)
Тогда
Если ОтключатьКонтрольЗаписи Тогда
Параметры.Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Попытка
Параметры.Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить(ТипЗнч(Параметры.Объект));
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
БылиИсключения = Истина;
Если ВыполнятьВТранзакции Тогда
Перейти ~ОТКАТ;
КонецЕсли;
КонецПопытки;
Параметры.Объект = Неопределено;
КонецЕсли;
ОбрабатываемаяСсылка = СтрокаТаблицы.Данные;
КонецЕсли;
Если Метаданные.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда
Если Параметры.Объект = Неопределено Тогда
Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();
КонецЕсли;
Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда
Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;
КонецЕсли;
КонецЦикла;
Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
Пока СтрокаТабЧасти <> Неопределено Цикл
СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;
СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого Движение ИЗ СтрокаТаблицы.Метаданные.Движения Цикл
БылиИсключения = Не ОбработатьЗаписьРегистра(Параметры.Объект.Движения[Движение.Имя], Заменяемые);
Если Истина
И БылиИсключения
И ВыполнятьВТранзакции
Тогда
Перейти ~ОТКАТ;
КонецЕсли;
КонецЦикла;
Для Каждого Последовательность ИЗ Метаданные.Последовательности Цикл
Если Последовательность.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда
НадоЗаписывать = Ложь;
НаборЗаписи = Последовательности[Последовательность.Имя].СоздатьНаборЗаписей();
НаборЗаписи.Отбор.Регистратор.Установить(СтрокаТаблицы.Данные);
НаборЗаписи.Прочитать();
Если НаборЗаписи.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Для Каждого Измерение ИЗ Последовательность.Измерения Цикл
Если Истина
И Измерение.Тип.СодержитТип(ТипЗнч(Ссылка))
И НаборЗаписи[0][Измерение.Имя] = Ссылка
Тогда
НаборЗаписи[0][Измерение.Имя] = ПравильныйЭлемент;
НадоЗаписывать = Истина;
КонецЕсли;
КонецЦикла;
Если НадоЗаписывать Тогда
Если ОтключатьКонтрольЗаписи Тогда
НаборЗаписи.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Попытка
НаборЗаписи.Записать();
Исключение
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
БылиИсключения = Истина;
Если ВыполнятьВТранзакции Тогда
Перейти ~ОТКАТ;
КонецЕсли;
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ИначеЕсли Метаданные.Справочники.Содержит(СтрокаТаблицы.Метаданные) Тогда
Если Параметры.Объект = Неопределено Тогда
Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();
КонецЕсли;
Если СтрокаТаблицы.Метаданные.Владельцы.Содержит(Ссылка.Метаданные()) И Параметры.Объект.Владелец = Ссылка Тогда
Параметры.Объект.Владелец = ПравильныйЭлемент;
КонецЕсли;
Если СтрокаТаблицы.Метаданные.Иерархический И Параметры.Объект.Родитель = Ссылка Тогда
Параметры.Объект.Родитель = ПравильныйЭлемент;
КонецЕсли;
Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда
Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;
КонецЕсли;
КонецЦикла;
Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
Пока СтрокаТабЧасти <> Неопределено Цикл
СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;
СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(СтрокаТаблицы.Метаданные)
ИЛИ Метаданные.ПланыСчетов.Содержит(СтрокаТаблицы.Метаданные)
ИЛИ Метаданные.ПланыВидовРасчета.Содержит(СтрокаТаблицы.Метаданные)
ИЛИ Метаданные.Задачи.Содержит(СтрокаТаблицы.Метаданные)
ИЛИ Метаданные.БизнесПроцессы.Содержит(СтрокаТаблицы.Метаданные) Тогда
Если Параметры.Объект = Неопределено Тогда
Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();
КонецЕсли;
Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда
Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;
КонецЕсли;
КонецЦикла;
Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
Пока СтрокаТабЧасти <> Неопределено Цикл
СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;
СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ИначеЕсли Метаданные.Константы.Содержит(СтрокаТаблицы.Метаданные) Тогда
Константы[СтрокаТаблицы.Метаданные.Имя].Установить(ПравильныйЭлемент);
ИначеЕсли Метаданные.РегистрыСведений.Содержит(СтрокаТаблицы.Метаданные) Тогда
МенеджерЗаписи = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьМенеджерЗаписи();
КоллизийныйМенеджерЗаписи = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьМенеджерЗаписи();
Периодический = (СтрокаТаблицы.Метаданные.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический);
Если Периодический Тогда
МенеджерЗаписи.Период = СтрокаТаблицы.Данные.Период;
КоллизийныйМенеджерЗаписи.Период = СтрокаТаблицы.Данные.Период;
КонецЕсли;
МассивИзмененныхИзмерений = Новый Массив;
Для каждого Рекв Из СтрокаТаблицы.Метаданные.Измерения Цикл
ЗначениеИзмерения = СтрокаТаблицы.Данные[Рекв.Имя];
МенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения;
Если ЗначениеИзмерения = Ссылка Тогда
КоллизийныйМенеджерЗаписи[Рекв.Имя] = ПравильныйЭлемент;
МассивИзмененныхИзмерений.Добавить(Рекв.Имя);
Иначе
КоллизийныйМенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения;
КонецЕсли;
КонецЦикла;
БылаКоллизия = Ложь;
Если МассивИзмененныхИзмерений.Количество() > 0 Тогда
КоллизийныйМенеджерЗаписи.Прочитать();
Если КоллизийныйМенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Прочитать();
МассивКоллекцийРеквизитов = Новый Массив;
МассивКоллекцийРеквизитов.Добавить(СтрокаТаблицы.Метаданные.Ресурсы);
МассивКоллекцийРеквизитов.Добавить(СтрокаТаблицы.Метаданные.Реквизиты);
Если Не СтруктураКоллизий.Свойство(СтрокаТаблицы.Метаданные.Имя) Тогда
ТаблицаЗаписей = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьНаборЗаписей().Выгрузить();
ТаблицаЗаписей.Колонки.Добавить(«МенеджерЗамены»);
ТаблицаЗаписей.Колонки.Добавить(«МенеджерОригинала»);
Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл
Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл
ИмяКолонки = МетаРеквизит.Имя;
ПредставлениеКолонки = МетаРеквизит.Представление();
КолонкаОригинала = ТаблицаЗаписей.Колонки[ИмяКолонки];
КолонкаОригинала.Имя = «Оригинал» + ИмяКолонки;
КолонкаОригинала.Заголовок = «Оригинал: » + ПредставлениеКолонки;
КолонкаЗамены = ТаблицаЗаписей.Колонки.Вставить(ТаблицаЗаписей.Колонки.Индекс(КолонкаОригинала),
«Замена» + ИмяКолонки, , «Замена: » + ПредставлениеКолонки);
ЗаполнитьЗначенияСвойств(КолонкаЗамены, КолонкаОригинала, , «Имя, Заголовок»);
КонецЦикла;
КонецЦикла;
ТаблицаЗаписей.Колонки.Вставить(0, «Заменить», Новый ОписаниеТипов(«Булево»), «Заменить»);
СтруктураКоллизий.Вставить(СтрокаТаблицы.Метаданные.Имя, ТаблицаЗаписей);
КонецЕсли;
НоваяКоллизийнаяЗапись = СтруктураКоллизий[СтрокаТаблицы.Метаданные.Имя].Добавить();
Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл
Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл
ИмяКолонки = МетаРеквизит.Имя;
ЗначениеРеквизита = МенеджерЗаписи[ИмяКолонки];
НоваяКоллизийнаяЗапись[«Оригинал» + ИмяКолонки] = КоллизийныйМенеджерЗаписи[ИмяКолонки];
Если ЗначениеРеквизита = Ссылка Тогда
НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки] = ПравильныйЭлемент;
Иначе
НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки] = ЗначениеРеквизита;
КонецЕсли;
КоллизийныйМенеджерЗаписи[ИмяКолонки] = НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки];
Если НоваяКоллизийнаяЗапись[«Оригинал» + ИмяКолонки] <> НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки] Тогда
БылаКоллизия = Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если БылаКоллизия Тогда
ЗаполнитьЗначенияСвойств(НоваяКоллизийнаяЗапись, КоллизийныйМенеджерЗаписи);
Для Каждого ИмяКолонки Из МассивИзмененныхИзмерений Цикл
НоваяКоллизийнаяЗапись[ИмяКолонки] = МенеджерЗаписи[ИмяКолонки];
КонецЦикла;
НоваяКоллизийнаяЗапись.МенеджерЗамены = КоллизийныйМенеджерЗаписи;
НоваяКоллизийнаяЗапись.МенеджерОригинала = МенеджерЗаписи;
Иначе
СтруктураКоллизий[СтрокаТаблицы.Метаданные.Имя].Удалить(НоваяКоллизийнаяЗапись);
МенеджерЗаписи.Удалить();
БылаКоллизия = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если БылаКоллизия Тогда
БылиИсключения = Ложь;
Иначе
БылиИсключения = Не ОбработатьЗаписьРегистра(МенеджерЗаписи, Заменяемые);
КонецЕсли;
Если Истина
И БылиИсключения
И ВыполнятьВТранзакции
Тогда
Перейти ~ОТКАТ;
КонецЕсли;
Иначе
Сообщить(«Ссылки типа «+СтрокаТаблицы.Метаданные+» не заменяются!!»);
КонецЕсли;
ОбработкаПрерыванияПользователя();
Если мФормаИндикатора <> Неопределено Тогда
мФормаИндикатора.Значение = мФормаИндикатора.Значение + 1;
Иначе
Состояние(«Выполнено » + Формат(100 * ТаблицаСсылок.Индекс(СтрокаТаблицы) + 1 / ТаблицаСсылок.Количество(), «ЧЦ=5; ЧДЦ=2») + «%»);
КонецЕсли;
КонецЦикла;
Если Параметры.Объект <> Неопределено Тогда
Если ОтключатьКонтрольЗаписи Тогда
Параметры.Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Попытка
Параметры.Объект.Записать();
Если ОтключатьКонтрольЗаписи Тогда
ЗаписьЖурналаРегистрации(«Запись с флагом Загрузка», УровеньЖурналаРегистрации.Информация, СтрокаТаблицы.Метаданные,
СтрокаТаблицы.Данные, «»);
КонецЕсли;
Исключение
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
БылиИсключения = Истина;
Если ВыполнятьВТранзакции Тогда
Перейти ~ОТКАТ;
КонецЕсли;
КонецПопытки;
КонецЕсли;
МассивЭлементовКУдалению = Новый Массив;
Для Каждого ЭлементТаблицыРегистра Из СтруктураКоллизий Цикл
Если ЭлементТаблицыРегистра.Значение.Количество() = 0 Тогда
МассивЭлементовКУдалению.Добавить(ЭлементТаблицыРегистра.Ключ);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементКУдалению Из МассивЭлементовКУдалению Цикл
СтруктураКоллизий.Удалить(ЭлементКУдалению);
КонецЦикла;
Если СтруктураКоллизий.Количество() > 0 Тогда
ФормаЗамещенияВНезависимыхРегистрахСведений = ПолучитьФорму(«ФормаЗамещенияВНезависимыхРегистрахСведений»);
ФормаЗамещенияВНезависимыхРегистрахСведений.СтруктураКоллизий = СтруктураКоллизий;
ФормаЗамещенияВНезависимыхРегистрахСведений.ОткрытьМодально();
КонецЕсли;
~ОТКАТ:
Если ВыполнятьВТранзакции Тогда
Если БылиИсключения Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;
Возврат Не БылиИсключения;
15 — 16.10.13 — 23:49
На первый взгляд все нормуль. Может какие обязательные реквизиты не заполнены в документе.
16 — 16.10.13 — 23:49
Поковыряйся перед записью и при записи этого дока
17 — 16.10.13 — 23:50
да вроде нет вручную делаю абсолютно те же действия (меняю значения, перепровожу) все ок, ничего лишнего…
18 — 16.10.13 — 23:50
(16) в том то и дело что выскакивает на всех доках
19 — 16.10.13 — 23:51
(16) а хотя ты знаешь, не всех, есть опредеенная группа, действительно пойду в этом направлении спасибо!
20 — 17.10.13 — 00:07
посмотри в ЖР ошибки и так какую ошибку он тебе говорит?
3axap_4
21 — 17.10.13 — 00:22
(20) чёт в жр ничего про ошибки нет, если делать в транзакции то у нее статус — отменено, если без — то завершено, но документ не в том ни в другом случае не сохраняется
При проведении документа созданного из внешнего приложения как COM объект появляется ошибка: «ошибка при вызове метода контекста (write): Произошла исключительная ситуация.Несоответствие типов (параметр номер «1»)». Код строки: Doc.Write(DocumentWriteMode.Posting); Просто запись проходит. Неужели COM объект не поддерживает проведение документов?
вот это наверно не нравиться DocumentWriteMode.Posting
V8Connection.DocumentWriteMode.Posting
Тэги:
Комментарии доступны только авторизированным пользователям
- Главная
- —
- Форум
- —
- ТЕХПОДДЕРЖКА
- —
- ЭКСЕЛОН — Загрузка в 1С из EXCEL
- —
- Ошибка при вызове метода контекста (Записать)
Вчера заметил, что перестали обновляется цены, проверил выгрузку и обнаружил что часть номенклатуры не записывается. Номенклатура_СоздатьОбновить 020: {ВнешняяОбработка.APPLIX_RU_ЗагрузкаИзExcel_ЗМ.МодульОбъекта(70081)}: Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика — ‘ПередЗаписью’: {Справочник.Номенклатура.МодульМенеджера(2911)}: Преобразование значения к типу Булево не может быть выполнено |
|
Ошибка при попытке обновить номенклатуру |
|
1С:Предприятие 8.3 (8.3.20.1674) Прикрепленные файлы |
|
Модуль создал номенклатуру, теперь ее невозможно открыть ТекстыЗапросов = Новый Массив; ИменаОбъектовМетаданных = Новый Массив; Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); Прикрепленные файлы |
|
пришлите ваш файл и скриншоты всех настроек колонок |
|
у нас загрузилось нормально доступ к базе дадите? попробуем на вашей базе отладкой посмотреть что не так |
|
Сергей Юданов Пользователь Сообщений: 23 |
#9
30.05.2022 15:03:02 Разобрались сами. На некоторые позиции номенклатуры в поле (Вид номенклатуры) было назначено не значение, а почему-то название категории в котором содержались значения. |
ПОСЛЕДНИЕ СООБЩЕНИЯ
Сейчас на форуме (гостей: 44)
Всего зарегистрированных пользователей: 2220
Приняло участие в обсуждении: 367
Всего тем: 822
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.