Информационный поток
Задания вакансии материалы разработки сообщения форума
Рубрики статей и материалов
Яндекс-директ

Ошибка SQL в УТ 11 при подборе документов расчета. Исправлено в релизе 11.1.9.61

  • Добавить свою публикацию
  • для этого требуется регистрация

 

Ошибка возникает при выполнении следующих действий:

  • В документах по движению денежных средств (ПКО, РКО, Поступление безналичных ДС, Списание безналичных ДС) жмем кнопку «Подобрать по остаткам»;
  • В открывшейся форме выделяем документы и жмем «Перенести в документ»

В результате получаем ошибку

Изображение

Условия возникновения ошибки

  • Клиент-серверный режим;
  • У автора ошибка проявилась на СУБД MS SQL Server 2008 R2 SP 3, обновление до последнего релиза (10.50.6000.34) не помогло; протестировать другие СУБД нет возможности;
  • В документе табличная часть расчетов пуста или поле «Объект расчетов» не заполнено;
  • Сумма документа больше чем сумма подобранных в форме документов расчетов;


Откуда «растут ноги»
В модуле общей формы ПодборПоРасчетамСПартнерами есть процедура ПоместитьПлатежиВХранилище().
В процедуре есть вызов функции ДенежныеСредстваСервер.ДоговорПоУмолчанию(). В качестве первого параметра передается значение Неопределено.

 &НаСервере
Процедура ПоместитьПлатежиВХранилище() 
    
    Платежи = ТаблицаОстатковРасчетов.Выгрузить(, "Выбран, Сумма, Заказ, СтатьяДвиженияДенежныхСредств, ВалютаВзаиморасчетов, Партнер, Контрагент, ТипРасчетов");
    МассивУдаляемыхСтрок = Новый Массив;
    Для Каждого СтрокаТаблицы Из Платежи Цикл
        Если Не СтрокаТаблицы.Выбран Тогда
            МассивУдаляемыхСтрок.Добавить(СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
    
    Для Каждого СтрокаТаблицы Из МассивУдаляемыхСтрок Цикл
        Платежи.Удалить(СтрокаТаблицы);
    КонецЦикла;
    
    Если Платежи.Итог("Сумма") < СуммаДокумента Тогда
        СтрокаТаблицы = Платежи.Добавить();
        СтрокаТаблицы.Сумма = СуммаДокумента - Платежи.Итог("Сумма");
        Если ЗначениеЗаполнено(Партнер) Тогда
            СтрокаТаблицы.Партнер = Партнер;
        Иначе
            СтрокаТаблицы.Партнер = ДенежныеСредстваСервер.ПолучитьПартнераПоКонтрагенту(Контрагент);
        КонецЕсли; 
        Если ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
            СтрокаТаблицы.Заказ = ДоговорКонтрагента;
        Иначе
            СтрокаТаблицы.Заказ = ДенежныеСредстваСервер.ДоговорПоУмолчанию(
                Неопределено,//Обратите внимание!!
                СтрокаТаблицы.Партнер,
                Контрагент,
                Организация,
                ПолучитьХозяйственнуюОперациюДоговора(ХозяйственнаяОперация));
        КонецЕсли; 
    КонецЕсли; 
    
    Платежи.Колонки.Добавить("ОснованиеПлатежа");
    Платежи.ЗагрузитьКолонку(Платежи.ВыгрузитьКолонку("Заказ"), "ОснованиеПлатежа");
    
    АдресПлатежейВХранилище = ПоместитьВоВременноеХранилище(Платежи, УникальныйИдентификатор);
    
КонецПроцедуры

В функции ДоговорПоУмолчанию()это значение передается в запрос, выполнение которого вызывает ошибку SQL 

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

    Выборка = Запрос.Выполнить().Выбрать();

 

Решение
В форме ПодборПоРасчетамСПартнерами в процедуре ПоместитьПлатежиВХранилище(), при вызове функции ДенежныеСредстваСервер.ДоговорПоУмолчанию() первым параметром передавать пустую ссылку на договор.

 &НаСервере
Процедура ПоместитьПлатежиВХранилище() 
    
    Платежи = ТаблицаОстатковРасчетов.Выгрузить(, "Выбран, Сумма, Заказ, СтатьяДвиженияДенежныхСредств, ВалютаВзаиморасчетов, Партнер, Контрагент, ТипРасчетов");
    МассивУдаляемыхСтрок = Новый Массив;
    Для Каждого СтрокаТаблицы Из Платежи Цикл
        Если Не СтрокаТаблицы.Выбран Тогда
            МассивУдаляемыхСтрок.Добавить(СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
    
    Для Каждого СтрокаТаблицы Из МассивУдаляемыхСтрок Цикл
        Платежи.Удалить(СтрокаТаблицы);
    КонецЦикла;
    
    Если Платежи.Итог("Сумма") < СуммаДокумента Тогда
        СтрокаТаблицы = Платежи.Добавить();
        СтрокаТаблицы.Сумма = СуммаДокумента - Платежи.Итог("Сумма");
        Если ЗначениеЗаполнено(Партнер) Тогда
            СтрокаТаблицы.Партнер = Партнер;
        Иначе
            СтрокаТаблицы.Партнер = ДенежныеСредстваСервер.ПолучитьПартнераПоКонтрагенту(Контрагент);
        КонецЕсли; 
        Если ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
            СтрокаТаблицы.Заказ = ДоговорКонтрагента;
        Иначе
            СтрокаТаблицы.Заказ = ДенежныеСредстваСервер.ДоговорПоУмолчанию(
                Справочники.ДоговорыКонтрагентов.ПустаяСсылка(),//Неопределено,Вместо Неопределено передаем пустую ссылку
                СтрокаТаблицы.Партнер,
                Контрагент,
                Организация,
                ПолучитьХозяйственнуюОперациюДоговора(ХозяйственнаяОперация));
        КонецЕсли; 
    КонецЕсли; 
    
    Платежи.Колонки.Добавить("ОснованиеПлатежа");
    Платежи.ЗагрузитьКолонку(Платежи.ВыгрузитьКолонку("Заказ"), "ОснованиеПлатежа");
    
    АдресПлатежейВХранилище = ПоместитьВоВременноеХранилище(Платежи, УникальныйИдентификатор);
    
КонецПроцедуры

 

 

Релизы
У автора эта ошибка проявилась в УТ 11.1.7.67 на платформах 8.3.1231 и 8.3.1248, в текущем релизе УТ 11.1.9.56 ошибка не исправлена.

Техподдержка 1С
Техподдержка посоветовала выполнить Тестирование и исправление, обратил их внимание на то, что ошибка находится в коде, ждем ответа.

 

 

Ошибка исправлена в релизе 11.1.9.61

Изменен текст запроса в функции  ДенежныеСредстваСервер.ДоговорПоУмолчанию()

 

 

 
0
Еще от автора
≡ к списку статей