Версия для печати темы (https://pro1c.org.ua/index.php?s=8013268e3b7b58df6849fec0296f82e3&showtopic=46635)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ В данной транзакции уже происходили ошибки...

Автор: Constantus 12.07.18, 12:39

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

В документе РКО в модулях по проведению и распроведения имеется код:

        Для Каждого Заявка Из РасшифровкаПлатежа Цикл
            Попытка
                Док = Заявка.ДокументПланированияПлатежа.ПолучитьОбъект();
                Док.РКО = Ссылка;
                Док.Записать(РежимЗаписиДокумента.Запись);
            Исключение
            КонецПопытки;
        КонецЦикла;


Именно этот код мне сейчас и создает проблемы при проведении и отмены проведения, выдает сообщение "В данной транзакции уже происходили ошибки"

Если его убрать, то всё нормально. Однако данный код вынужденное зло, т.к. начальника потребовал, чтобы после формирования РКО в соответствующей Заявке (у нас ведется обязательный учет по Заявкам).

Именно применение "Попытка" и создает проблемы, но если это убрать, то тоже создаются проблемы при проведении и антипроведении, т.к. на филиалах применение Заявок не обязательно.

Что можно придумать, чтобы ошибки не было, но и код выполнялся для записи ссылки на документ?

Автор: podcast 12.07.18, 13:02

Constantus @ Сегодня, 13:39 * ,
Попробуйте поставить Остановку по ошибке в конфигруаторе, увиите где при записи возникает ошибка.
Не и можно в Попытке НачатьТранзацкию, может поможет.

Автор: Constantus 12.07.18, 13:30

Ну и код при отмене проведения

    Для Каждого Заявка Из РасшифровкаПлатежа Цикл
        Попытка            
            Док = Заявка.ДокументПланированияПлатежа.ПолучитьОбъект();
            Док.РКО = Документы.РасходныйКассовыйОрдер.ПустаяСсылка();
            Док.Записать(РежимЗаписиДокумента.Запись);
        Исключение
        КонецПопытки;
    КонецЦикла;


Т.е. ссылка на РКО в Заявке удаляется...

Мож есть какой другой метод записи ссылки в другом документе?

podcast @ Сегодня, 16:02 * ,

Прерыватель отладчика ничего не дал...

Вот не совсем понял про НачатьТранзакцию();

Мне вначале модуля проведения поставить? И что дает эта штука?

Автор: sava1 12.07.18, 13:46

Цитата(podcast @ 12.07.18, 14:02) *
Попытке НачатьТранзацкию, может поможет.


не поможет
проведение уже проходит в транзакции


попробуйте перед записью менять документы, а не при проведении

Автор: Constantus 12.07.18, 13:53

Цитата(sava1 @ 12.07.18, 16:46) *
попробуйте перед записью менять документы, а не при проведении


В случае признания документа, ссылка должна записаться, в случае отмены проведения, установки на удаление ссылка должна быть удалена, даже если там ее нет

Подскажите как правильно сделать перед записью, т.е. осуществить проверку на действие (проведение, отмена проведения, удаление)?

Автор: Zaval 12.07.18, 14:10

Цитата(Constantus @ 12.07.18, 13:39) *
Что можно придумать, чтобы ошибки не было, но и код выполнялся для записи ссылки на документ?

Нпр, вынести код в ПодпискуНаСобытие, проверять филиальность перед выполнением.

Автор: Constantus 12.07.18, 15:06

Попробовал убрать "Попытку"

        Для Каждого Заявка Из РасшифровкаПлатежа Цикл
            //Попытка
            Если НЕ РазрешеныПлатежи[0].Значение Тогда
                Док = Заявка.ДокументПланированияПлатежа.ПолучитьОбъект();
                Док.РКО = Ссылка;
                Док.Записать(РежимЗаписиДокумента.Запись);
            КонецЕсли;    
            //Исключение
            //КонецПопытки;
        КонецЦикла;


Не записывает: Ошибка при вызове метода контекста (Записать)

С "Попыткой" Записывает, без не записывает... Что не так я сделал?

Цитата(sava1 @ 12.07.18, 16:46) *
попробуйте перед записью менять документы, а не при проведении


Попробовал в модуле объекта "При записи"

    Для Каждого Заявка Из РасшифровкаПлатежа Цикл
        //Попытка            
        Если НЕ РазрешеныПлатежи[0].Значение Тогда
            Док = Заявка.ДокументПланированияПлатежа.ПолучитьОбъект();
            Док.РКО = Ссылка;//Документы.РасходныйКассовыйОрдер.ПустаяСсылка();
            Док.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;    
        //Исключение
        //КонецПопытки;
    КонецЦикла;


Та жа ошибка при записи

Автор: Zaval 12.07.18, 15:58

Зачем это вообще делать? Шоб базу положить?

Автор: Constantus 13.07.18, 5:48

Цитата(Zaval @ 12.07.18, 18:58) *
Зачем это вообще делать? Шоб базу положить?


Хотелка начальника... Он хочет видеть на форме списка Заявок сделан ли РКО по данной Заявке или нет...

Может есть другой способ отразить закрытую Заявку?

Автор: Vidocq05 13.07.18, 9:54

Цитата(Constantus @ 13.07.18, 6:48) *
Хотелка начальника... Он хочет видеть на форме списка Заявок сделан ли РКО по данной Заявке или нет...

Может есть другой способ отразить закрытую Заявку?

Если это нужно только для того, что-бы видеть на форме списка Заявок сделан ли РКО, то как вариант, сделайте реквизит в форме списка (не реквизит объекта) Заявок "РКО" и получайте ссылки на РКО "ПриВыводеСтроки" в табличном поле Заявок.

Автор: Zaval 13.07.18, 10:42

Цитата(Constantus @ 13.07.18, 6:48) *
Хотелка начальника... Он хочет видеть на форме списка Заявок сделан ли РКО по данной Заявке или нет...

Проведите РКО с указанными Заявками и посмотрите Движения. Там все уже есть. Выбирайте по Заявке и показывайте где нужно.


Цитата(Vidocq05 @ 13.07.18, 10:54) *
"ПриВыводеСтроки"

Выполнять Запрос при выводе каждой строки? "На вас серверов не напасешься" smile.gif

Автор: Constantus 13.07.18, 11:19

Цитата(Vidocq05 @ 13.07.18, 12:54) *
сделайте реквизит в форме списка (не реквизит объекта) Заявок "РКО" и получайте ссылки на РКО "ПриВыводеСтроки" в табличном поле Заявок.

Цитата(Zaval @ 13.07.18, 13:34) *
посмотрите Движения. Там все уже есть.


Идеи хорошие, не могу их как-то реализовать.
Создал реквизит формы списка "РКО" (на вкладке "Реквизиты") с ссылкой на документы РКО

Пытаюсь вставить новую колонку в ТЧ формы списка Заявок, но там нет возможность выбрать данные, т.е. выбрать этот новый реквизит "РКО".

Теперь о регистрах. Да в РН "Движения денежных средств" есть ссылка на Заявку.

Как можно одной строкой вытащить Регистратор (РКО), зная "ДокументПланированияПлатежа" (Заявка) из этого регистра накопления и "получайте ссылки на РКО "ПриВыводеСтроки" в табличном поле Заявок" как это предложил Vidocq05.

Цитата(Zaval @ 13.07.18, 13:42) *
Выполнять Запрос при выводе каждой строки? "На вас серверов не напасешься"


Значит не я один затаил сомнения... icon_beer17.gif

Автор: Petre 13.07.18, 11:46

QUOTE (Zaval @ 13.07.18, 10:42) *
Выполнять Запрос при выводе каждой строки? "На вас серверов не напасешься" smile.gif

При дефиците серверов обычно вместо "ПриВыводеСтроки" пользуют "ПриПолученииДанных"...

Автор: Constantus 13.07.18, 12:14

иЙолки-палочки... Всё перепробовал, даже открытие формы Заявок

        Для Каждого Заявка Из РасшифровкаПлатежа Цикл
                Док = Заявка.ДокументПланированияПлатежа.ПолучитьОбъект();
                Док.РКО = Документы.РасходныйКассовыйОрдер.ПустаяСсылка();
                Форма = Док.ПолучитьФорму("ФормаДокумента");
                Форма.Открыть();
                //Форма.ЭлементыФормы.РКО = Документы.РасходныйКассовыйОрдер.ПустаяСсылка();
                //Форма.Закрыть();
                //Док.Записать(РежимЗаписиДокумента.Запись);
        КонецЦикла;


Но как сохранить изменения в открытой форме и закрыть её не получается.

Вообщем я начал паниковать icon_cuss.gif

Подскажите детально как бы Вы сделали эту хотелку без "Попытка"?
Интересная идея с дополнительным реквизитом формы списка и как при этом использовать "ПриВыводеСтроки", если это действительно не кушает ресурсы при открытии, т.к. нужно будет выделять строки, где есть РКО...

Автор: Zaval 13.07.18, 12:48

Цитата(Constantus @ 13.07.18, 13:14) *
Подскажите детально как бы Вы сделали эту хотелку без "Попытка"?

Я бы не курочил Список, а склепал бы простой отчет для начальника.
Все хотелки в виде отчетов собрал бы в отдельную красивую форму, нпр "Пульт управления компанией".
И начальник был бы счастлив и юзеры не натыкались бы на побочные эффекты его хотелок и конфа бы обновлялась.


Напишите в списке Заявок запрос к регистру, где РКО пишет Заявки.
Пусть выполняется для начальника - по Роли.


Автор: Constantus 13.07.18, 13:12

Вот сделал такую вещч:

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    
        // Соответствие создается для заполнения остатков в строках табличного поля
    Для каждого Стр из ОформленияСтрок Цикл

        Стр.Ячейки.РРКО.Значение = ПолучитьРКО(Стр.ДанныеСтроки.Ссылка);

    КонецЦикла;
    
КонецПроцедуры

Функция ПолучитьРКО(Основа)
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    ДвиженияДенежныхСредств.Регистратор
        |ИЗ
        |    РегистрНакопления.ДвиженияДенежныхСредств КАК ДвиженияДенежныхСредств
        |ГДЕ
        |    ДвиженияДенежныхСредств.ДокументПланированияПлатежа = &Основа";
    
    Запрос.УстановитьПараметр("Основа", Основа);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Результат = ВыборкаДетальныеЗаписи.Регистратор;
    КонецЦикла;
    
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА


     Возврат Результат;
    
КонецФункции


Вроде срабатывает, но явно тормозит... Может есчо есть пооптимальней?


Как можно получить данные из РН одной строкой, типа

Результат = РегистрыНакопления.РегистрТакойто.(?????)

Автор: Zaval 13.07.18, 14:12

Цитата(Petre @ 13.07.18, 12:46) *
При дефиците серверов обычно вместо "ПриВыводеСтроки" пользуют "ПриПолученииДанных"...

"Во избежание дефицита..."

Цитата(Constantus @ 13.07.18, 14:12) *
Вроде срабатывает, но явно тормозит... Может есчо есть пооптимальней?

???
Почему в Списке РКО, если данные нужны в списке Заявок?
Запрос должен выполняться не по каждой строке, а 1 раз по списку выведенных в форму Заявок

Автор: Constantus 13.07.18, 14:17

Цитата(Zaval @ 13.07.18, 17:12) *
Почему в Списке РКО, если данные нужны в списке Заявок?
Запрос должен выполняться не по каждой строке, а 1 раз по списку выведенных в форму Заявок


Как раз в Списке Заявок, есть левая колонка, вот туда и прописываются.

Я выложил код. Вы предложили другую идею "Запрос должен выполняться не по каждой строке, а 1 раз по списку выведенных в форму Заявок"

Как это осуществить?

Автор: Constantus 13.07.18, 16:14

На ИТС нашел вот такой код: http://pro1c.org.ua/redirect.php?https://its.1c.ru/db/metod8dev#content:2805:hdoc

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)

    
        Соответствие = Новый Соответствие;

    // Заполнение параметра - массива значений ссылками на отображаемые строки табличного поля
    СсылкиМассив = Новый Массив;
    Для каждого Стр из ОформленияСтрок Цикл

        СсылкиМассив.Добавить(Стр.ДанныеСтроки.Ссылка);
        Соответствие.Вставить(Стр.ДанныеСтроки.Ссылка, Стр);

    КонецЦикла;

    // Сформировать запрос для получения остатков
    ЗапросОстатка = Новый Запрос;
    ЗапросОстатка.Текст = "ВЫБРАТЬ
                          |    ДвиженияДенежныхСредств.Регистратор Как Регистратор
                          |ИЗ
                          |    РегистрНакопления.ДвиженияДенежныхСредств КАК ДвиженияДенежныхСредств
                          |ГДЕ
                          |    ДвиженияДенежныхСредств.ДокументПланированияПлатежа В(&ДокументПланированияПлатежа)";

    ЗапросОстатка.УстановитьПараметр("ДокументПланированияПлатежа", СсылкиМассив);
    Выборка = ЗапросОстатка.Выполнить().Выбрать();

    //Вывести остаток в строку, найденную в соответствии по номенклатуре из запроса
    Пока Выборка.Следующий() Цикл

        Соответствие.Получить(Выборка.Регистратор).Ячейки.РРКО.Значение = Выборка.Регистратор;

    КонецЦикла;
    

    
КонецПроцедуры


Код переделал под свои нужды, но выдает такую ошибку:

{Документ.ЗаявкаНаРасходованиеСредств.Форма.ФормаСписка.Форма(146)}: Значение не является значением объектного типа (Ячейки)
        Соответствие.Получить(Выборка.Регистратор).Ячейки.РРКО.Значение = Выборка.Регистратор;




Вот нашел другой код, вроде работает:

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



Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua