9 — 11.07.19 — 09:50
(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;
ТекущийДокументОтгрузкиПоставки = СтрокаОтгрузкиПоставки.РасчетныйДокумент;
КонецЕсли;
//Добавляем строку погашения задолженности.
НовСтр_Долг_Расход = ТаблицаРасчетовПоСрокам.Добавить();
НовСтр_Долг_Расход.ВидДвижения = ВидДвиженияНакопления.Расход;
НовСтр_Долг_Расход.ДокументРегистратор = СтрокаОплаты.Регистратор;
//Взаимозачет считаем взаимозачетом
Если СтрокаОплаты.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВзаимозачетЗадолженности Тогда
НовСтр_Долг_Расход.ХозяйственнаяОперация = СтрокаОплаты.ХозяйственнаяОперация;
Иначе
НовСтр_Долг_Расход.ХозяйственнаяОперация = ХозяйственныеОперации[«ПогашениеЗадолженности»];
КонецЕсли;
НовСтр_Долг_Расход.ВалютаДокумента = СтрокаОплаты.ВалютаДокумента;
НовСтр_Долг_Расход.Период = СтрокаОплаты.Период;
НовСтр_Долг_Расход.ПорядокОпера
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
Ошибка Записать(РежимЗаписиДокумента.ОтменаПроведения)
Автор dimanuga, 31 окт 2018, 18:14
0 Пользователей и 1 гость просматривают эту тему.
К кнопке на форме привязана отмена проведения:
&НаКлиенте
Процедура ОтменитьПроведение(Команда)
ПоказатьВопрос(Новый ОписаниеОповещения(«ПередОтменойПроведения», ЭтотОбъект),
«Отменить проведение документов?», РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПередОтменойПроведения(Результат, Отказ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ВызовОтменыПроведения();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВызовОтменыПроведения()Экспорт
ЭтаФорма.Записать(РежимЗаписиДокумента.ОтменаПроведения);
ЭтаФорма.Модифицированность = Ложь;
Закрыть();
КонецПроцедуры
Ошибка:
{Документ.ПоступлениеЖивотных.Форма.ФормаДокумента.Форма(242)}: Ошибка при вызове метода контекста (Записать)
ЭтаФорма.Записать(РежимЗаписиДокумента.ОтменаПроведения);
по причине:
Несоответствие типов (параметр номер ‘1’)
Несоответствие типов (параметр номер ‘1’)
В чем моя ошибка?
Скорее всего, потому что у формы записать может быть только так ЭтаФорма.Записать();
Если передавать какой либо параметр, то только через структуру, а не как обычно с объектами.
Читайте справку.
Помог, нажми спасибо. Не помог, нажми спасибо 🙂
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google
Ну хорошо, а как передать РежимЗаписи.ОтменаРедактирования ?
Можно на примере ?
Цитата: dimanuga от 31 окт 2018, 19:42
Ну хорошо, а как передать РежимЗаписи.ОтменаРедактирования ?
Можно на примере ?
Ни разу не делал, попробуй так
Структура.Вставить(«РежимЗаписиДокумента», РежимЗаписиДокумента.ОтменаПроведения);
Помог, нажми спасибо. Не помог, нажми спасибо 🙂
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google
Почему и зачем ЭтаФорма, а не ЭтотОбъект?
Ну да ладно.
ЭтаФорма.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.ОтменаПроведения));
ЭтаФорма.Записать(Новый Структура(«РежимЗаписи», РежимЗаписиДокумента.ОтменаПроведения));
{Документ.ПоступлениеЖивотных.Форма.ФормаДокумента.Форма(262)}: Поле объекта недоступно для записи (РежимЗаписиДокумента)
РежимЗаписиДокумента = ПараметрыЗаписи;
Или так:
ПараметрыФ = Новый Структура(«РежимЗаписиДокумента», РежимЗаписиДокумента.ОтменаПроведения);
ЭтаФорма.Записать(ПараметрыФ);
{Документ.ПоступлениеЖивотных.Форма.ФормаДокумента.Форма(266)}: Поле объекта недоступно для записи (РежимЗаписиДокумента)
РежимЗаписиДокумента = ПараметрыЗаписи;
РежимЗаписиДокумента = ПараметрыЗаписи;
Ты уверен, что этого нигде не писал? Например в строке 262 или 266