В 1С:Управление торговлей 11.5 есть возможность использовать 2 архитектуры расчетов: офлайн (старая) и онлайн (новая).
Если у вас этого переключателя не видно, значит у вас уже Онлайн.
В данной публикации рассматриваются только расчеты с клиентами. Офлайн (старая) архитектура использует регистр накопления РасчетыСКлиентами, онлайн (новая) - регистр накопления РасчетыСКлиентамиПоСрокам.
Иногда после обновления ведомость взаиморасчетов или сверка взаиморасчетов показывает неправильные остатки или обороты. Радует, что "портится" только один регистр РасчетыСКлиентамиПоСрокам. Сверяться можно по-прежнему по регистру РасчетыСКлиентами. Но только с помощью консоли запросов т.к. все штатные отчеты будут брать данные из регистра РасчетыСКлиентамиПоСрокам.
Приложенная обработка делает следующее:
- очищает регистр РасчетыСКлиентамиПоСрокам по заданному Партнеру
- перезаполняет регистр РасчетыСКлиентамиПоСрокам по заданному Партнеру по данным регистра РасчетыСКлиентами.
Тестировалось на демо базе конфигурации 1С:Управление торговлей 11.5.9.119 на платформе 8.3.21.1302. Код обработки ниже.
&НаКлиенте
Процедура ПартнерПриИзменении(Элемент)
ПартнерПриИзмененииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПартнерПриИзмененииНаСервере()
ДолгОфлайн = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетыСКлиентамиОстатки.СуммаОстаток КАК ДолгОфлайн
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Остатки(, АналитикаУчетаПоПартнерам.Партнер = &Партнер) КАК РасчетыСКлиентамиОстатки";
Запрос.УстановитьПараметр("Партнер", Партнер);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ДолгОфлайн = ВыборкаДетальныеЗаписи.ДолгОфлайн;
КонецЕсли;
ДолгОнлайн = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетыСКлиентамиПоСрокамОстатки.ДолгОстаток - РасчетыСКлиентамиПоСрокамОстатки.ПредоплатаОстаток КАК ДолгОнлайн
|ИЗ
| РегистрНакопления.РасчетыСКлиентамиПоСрокам.Остатки(, АналитикаУчетаПоПартнерам.Партнер = &Партнер) КАК РасчетыСКлиентамиПоСрокамОстатки";
Запрос.УстановитьПараметр("Партнер", Партнер);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ДолгОнлайн = ВыборкаДетальныеЗаписи.ДолгОнлайн;
КонецЕсли;
Разница = ДолгОфлайн - ДолгОнлайн;
КонецПроцедуры
&НаКлиенте
Процедура ОткорректироватьРасчеты(Команда)
ОчиститьРасчетыПартнераНаСервере();
ОбработатьДокументыНаСервере();
ПартнерПриИзмененииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОчиститьРасчетыПартнераНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РасчетыСКлиентамиПоСрокамОбороты.Регистратор КАК Регистратор
|ПОМЕСТИТЬ РегистраторыРасчетов
|ИЗ
| РегистрНакопления.РасчетыСКлиентамиПоСрокам.Обороты(, , Регистратор, АналитикаУчетаПоПартнерам.Партнер = &Партнер) КАК РасчетыСКлиентамиПоСрокамОбороты
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РегистраторРасчетов.Ссылка
|ИЗ
| Документ.РегистраторРасчетов КАК РегистраторРасчетов
|ГДЕ
| РегистраторРасчетов.АналитикаУчетаПоПартнерам.Партнер = &Партнер
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| РегистраторыРасчетов.Регистратор КАК Регистратор
|ИЗ
| РегистраторыРасчетов КАК РегистраторыРасчетов";
Запрос.УстановитьПараметр("Партнер", Партнер);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НаборЗаписей = РегистрыНакопления.РасчетыСКлиентамиПоСрокам.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
НаборЗаписей.Записать();
РегистраторРасчетовОбъект = ВыборкаДетальныеЗаписи.Регистратор.ПолучитьОбъект();
РегистраторРасчетовОбъект.Удалить();
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОбработатьДокументыНаСервере()
СписокОбъектовВзаиморасчетов = СписокОбъектовВзаиморасчетов();
Для каждого СтрокаОбъектыВзаиморасчетов из СписокОбъектовВзаиморасчетов Цикл
ДокументСсылка = НайтиРегистраторРасчетов(СтрокаОбъектыВзаиморасчетов);
Если ДокументСсылка.Пустая() Тогда
ДокументОбъект = Документы.РегистраторРасчетов.СоздатьДокумент();
ДокументОбъект.Комментарий = "кс";
ДокументОбъект.Валюта = СтрокаОбъектыВзаиморасчетов.Ссылка.Валюта;
ДокументОбъект.АналитикаУчетаПоПартнерам = СтрокаОбъектыВзаиморасчетов.АналитикаУчетаПоПартнерам;
ДокументОбъект.Организация = СтрокаОбъектыВзаиморасчетов.Ссылка.Организация;
ДокументОбъект.ОбъектРасчетов = СтрокаОбъектыВзаиморасчетов.Ссылка;
ДокументОбъект.ТипРасчетов = Перечисления.ТипыРасчетовСПартнерами.РасчетыСКлиентом;
ДокументОбъект.Дата = ТекущаяДатаСеанса();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Иначе
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
КонецЕсли;
ТаблицаДвижений = ПолучитьТаблицуДвижений(СтрокаОбъектыВзаиморасчетов.Ссылка);
НаборЗаписей = РегистрыНакопления.РасчетыСКлиентамиПоСрокам.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка);
НаборЗаписей.Загрузить(ТаблицаДвижений);
НаборЗаписей.Записать();
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СписокОбъектовВзаиморасчетов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетыСКлиентамиОбороты.ОбъектРасчетов КАК Ссылка,
| РасчетыСКлиентамиОбороты.СуммаПриход КАК Приход,
| РасчетыСКлиентамиОбороты.СуммаРасход КАК Расход,
| РасчетыСКлиентамиОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Обороты(, , , АналитикаУчетаПоПартнерам.Партнер = &Партнер) КАК РасчетыСКлиентамиОбороты
|
|УПОРЯДОЧИТЬ ПО
| РасчетыСКлиентамиОбороты.ОбъектРасчетов.Дата";
Запрос.УстановитьПараметр("Партнер", Партнер);
РезультатЗапроса = Запрос.Выполнить();
СписокОбъектовВзаиморасчетов = РезультатЗапроса.Выгрузить();
Возврат СписокОбъектовВзаиморасчетов;
КонецФункции
&НаСервере
Функция НайтиРегистраторРасчетов(СтрокаОбъектыВзаиморасчетов)
Результат = Документы.РегистраторРасчетов.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистраторРасчетов.Ссылка КАК Ссылка
|ИЗ
| Документ.РегистраторРасчетов КАК РегистраторРасчетов
|ГДЕ
| РегистраторРасчетов.Валюта = &Валюта
| И РегистраторРасчетов.АналитикаУчетаПоПартнерам = &АналитикаУчетаПоПартнерам
| И РегистраторРасчетов.Организация = &Организация
| И РегистраторРасчетов.ОбъектРасчетов = &ОбъектРасчетов
| И РегистраторРасчетов.ТипРасчетов = &ТипРасчетов";
Запрос.УстановитьПараметр("АналитикаУчетаПоПартнерам", СтрокаОбъектыВзаиморасчетов.АналитикаУчетаПоПартнерам);
Запрос.УстановитьПараметр("Валюта", СтрокаОбъектыВзаиморасчетов.Ссылка.Валюта);
Запрос.УстановитьПараметр("ОбъектРасчетов", СтрокаОбъектыВзаиморасчетов.Ссылка);
Запрос.УстановитьПараметр("Организация", СтрокаОбъектыВзаиморасчетов.Ссылка.Организация);
Запрос.УстановитьПараметр("ТипРасчетов", Перечисления.ТипыРасчетовСПартнерами.РасчетыСКлиентом);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Результат = ВыборкаДетальныеЗаписи.Ссылка;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ПолучитьТаблицуДвижений(ОбъектРасчетов)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетыСКлиентамиОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам,
| РасчетыСКлиентамиОбороты.ОбъектРасчетов КАК ОбъектРасчетов,
| РасчетыСКлиентамиОбороты.Валюта КАК Валюта,
| РасчетыСКлиентамиОбороты.Регистратор КАК РасчетныйДокумент,
| РасчетыСКлиентамиОбороты.СуммаОборот КАК Долг,
| РасчетыСКлиентамиОбороты.СуммаОборот КАК ДолгРегл,
| РасчетыСКлиентамиОбороты.СуммаОборот КАК ДолгУпр,
| РасчетыСКлиентамиОбороты.Период КАК Период,
| РасчетыСКлиентамиОбороты.Регистратор КАК ДокументРегистратор
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Обороты(, , Регистратор, ОбъектРасчетов = &ОбъектРасчетов) КАК РасчетыСКлиентамиОбороты";
Запрос.УстановитьПараметр("ОбъектРасчетов", ОбъектРасчетов);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДвижений = РезультатЗапроса.Выгрузить();
ТаблицаДвижений.Колонки.Добавить("ВидДвижения", Новый ОписаниеТипов("ВидДвиженияНакопления"));
ТаблицаДвижений.Колонки.Добавить("ХозяйственнаяОперация", Новый ОписаниеТипов("ПеречислениеСсылка.ХозяйственныеОперации"));
Для каждого СтрокаДвижения из ТаблицаДвижений Цикл
СтрокаДвижения.ВидДвижения = ВидДвиженияНакопления.Приход;
СтрокаДвижения.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
Если СтрокаДвижения.Долг < 0 Тогда
СтрокаДвижения.Долг = -СтрокаДвижения.Долг;
СтрокаДвижения.ДолгРегл = -СтрокаДвижения.ДолгРегл;
СтрокаДвижения.ДолгУпр = -СтрокаДвижения.ДолгУпр;
СтрокаДвижения.ВидДвижения = ВидДвиженияНакопления.Расход;
СтрокаДвижения.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПогашениеЗадолженностиКлиента;
КонецЕсли;
КонецЦикла;
Возврат ТаблицаДвижений;
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПартнерПриИзмененииНаСервере();
КонецПроцедуры