8.х Записать объект по ссылке на УФ

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем kogor, 24 окт 2014.

  1. TopicStarter Overlay
    kogor
    Offline

    kogor Опытный в 1С

    Регистрация:
    5 фев 2010
    Сообщения:
    412
    Симпатии:
    0
    Баллы:
    26
    Добрый день.

    Конфигурация БП 3.0, платформа 8.3.5.1146

    Хочу в этой конфигурации запустить свою старую обработку, которая была написана под обычное приложение. Обработка полезная (загружает данные из Excel), но переделывать ее под управляемые формы смысла нет. Результатом работы этой обработки является изменение одного из реквизитов справочника и запись этого элемента справочника. Все просто.

    Я подумал, почему бы не запустить приложение в режиме Толстый клиент (обычное приложение) и не поработать с этой обработкой.

    Сделал тестовую файловую базу, запустил приложение, открыл обработку, запустил - все отлично отработало, в справочнике изменился реквизит, элементы справочника записаны.

    Решил сделать тоже самое на рабочей базе на SQL-сервере. Запустил приложение, запустил обработку, все работало, но в момент записи элемента справочника появилась ошибка.

    В отладчике увидел, что в процедуре ПриЗаписи элемента справочника происходит передача данных на сервер и возникает ошибка при передаче мутабельного значения с клиента на сервер.

    Потому что элемент у меня записывался так:

    Код:
    ЭлементОбъект  = ЭлементСсылка.ПолучитьОбъект();
    ЭлементОбъект.МойРеквизит = "бла-бла";
    ЭлементОбъект.Записать();
    ЭлементСсылка - это элемент типа СправочникСсылка, находящийся в одной из колонок табличного поля на форме, другими словами я перебираю строки таблицы, из одной колонки беру ссылку, а из другой значение, которое записываю в реквизит. Все просто, но вот с передачей данных на сервер засада.

    Опыта программирования на УФ у меня мало. Методом тыка пытался установить директивы &НаСервере, переносить процедуру записи из модуля формы в модуль объекта, переводил РеквизитФормыВЗначение и обратно, но так и не получается - идут ошибки о том что не определена такая то процедура на Сервере и т.п.

    Подскажите, пожалуйста, как оформить запись элемента справочника, имея ссылку на этот элемент? Где нужно расположить переход с процедуры &НаКлиенте на процедуру &НаСервере?

    Задачка вроде бы простая, но я не смог найти точную реализацию
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Код:
    &НаCервере
    ТекОбъект = РеквизитФормыВЗначение("Объект");
    ТекОбъект.Записать();
    kogor нравится это.
  3. TopicStarter Overlay
    kogor
    Offline

    kogor Опытный в 1С

    Регистрация:
    5 фев 2010
    Сообщения:
    412
    Симпатии:
    0
    Баллы:
    26
    Да такую конструкцию я пробовал, но что такое здесь ТекОбъект? Как передать в эту процедуру ссылку на элемент справочника?
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Прошу прощения, это вариант записи объекта из его формы. Вам оно не подойдет.
    kogor нравится это.
  5. TopicStarter Overlay
    kogor
    Offline

    kogor Опытный в 1С

    Регистрация:
    5 фев 2010
    Сообщения:
    412
    Симпатии:
    0
    Баллы:
    26
    Да мне именно надо по ссылке получить объект, изменить реквизит и записать объект. А работает это в форме внешней обработки. От нее надо как то перейти к объекту элемента справочника
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Долбанный вайфай у смарта....ща приду на работу напишу верный вариант, а то уже 2 раза написал одно и то же, но сохранить не смог из-за того, что связь обрывается.
    kogor нравится это.
  7. TopicStarter Overlay
    kogor
    Offline

    kogor Опытный в 1С

    Регистрация:
    5 фев 2010
    Сообщения:
    412
    Симпатии:
    0
    Баллы:
    26
    Спасибо, буду ждать!
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Итак:
    Если у нас есть код, выполняемый в форме внешней обработки, то должно быть как-то так:

    в модуле формы:
    Код:
    &НаКлиенте
    Процедура Выполнить()
    
    Для Каждого Стр Из ТЗ Цикл
    .....
    СсылкаНаОбъект = Стр.СсылкаНаЭлементСправочника;
    ЗначениеРеквизита = Стр.ЗначениеРеквизита;
    
    ЗаписатьОбъектНаСервереБезКонтекста(СсылкаНаОбъект, ЗначениеРеквизита)
    
    КонецЦикла;
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура ЗаписатьОбъектНаСервереБезКонтекста(СсылкаНаОбъект, ЗначениеРеквизита)
    
    ТекОбъект = СсылкаНаОбъект.ПолучитьОбъект();
    ТекОбъект.<ИмяРеквизита> = ЗначениеРеквизита;
    ТекОбъект.Записать();
    
    КонецПроцедуры
    
    kogor нравится это.
  9. TopicStarter Overlay
    kogor
    Offline

    kogor Опытный в 1С

    Регистрация:
    5 фев 2010
    Сообщения:
    412
    Симпатии:
    0
    Баллы:
    26
    Спасибо! Сейчас попробую
    --- Объединение сообщений, 24 окт 2014 ---
    Тестирую: в модуле формы внешней обработки написал так:

    Код:
    &НаКлиенте
    Процедура ОсновныеДействияФормыЗаписать(Кнопка)
        ЗаписатьОбъектНаСервереБезКонтекста(ЛицевойСчет, ПодстрокаПоиска)
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура ЗаписатьОбъектНаСервереБезКонтекста(СсылкаНаОбъект, ЗначениеРеквизита)
        ТекОбъект = СсылкаНаОбъект.ПолучитьОбъект();
        ТекОбъект.ЛицевойСчетКРЦ = ЗначениеРеквизита;
        ТекОбъект.Записать();
    КонецПроцедуры
    
    где Лицевой счет - реквизит обработки, расположен на форме, тип СправочникСсылка, ПодстрокаПоиска - реквизит обработки, расположен на форме, тип Строка(50)

    Получил ошибку:

    Последнее редактирование: 24 окт 2014
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Приложил файл. Работает 100%. Но это простейший пример.
    Я так понимаю, что ТЗ для обработки вы каким-то способом формируете.
    Необходимо создать ТЗ в виде реквизита формы, ее набивать данными и потом ее использовать вместо выборки, но в таком случае процедура должна иметь дерективу препроцессору &НаСервере, чтобы ТЗ, как реквизит формы, был доступен в коде процедуры напрямую.

    Вложения:

    kogor нравится это.
  11. TopicStarter Overlay
    kogor
    Offline

    kogor Опытный в 1С

    Регистрация:
    5 фев 2010
    Сообщения:
    412
    Симпатии:
    0
    Баллы:
    26
    Попробовал текст из Вашей обработки вставить в свою, получил все равно такую же ошибку

    Я думаю, что Ваш код работает на управляемой форме в управляемом приложении, а у меня приложение обычное и форма обычная, поэтому не видит из процедуры &НаКлиенте процедуру &НаСервереБезКонтекста

    Прикрепляю обработку, в ней на форме кнопка Записать
    2014-10-24_133051.png

    Вот под ней я вставил Ваш код и получил ошибку

    Вложения:

  12. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Дык если все обычное, то и заморачиваться не стоит с дерективами.
    Все работает как и раньше:

    в модуле формы обработки:

    Для каждого Стр Из ТЗ Цикл

    ТекОбъект = Стр.<ИмяКолонкиССсылкойНаЭлементСправочника>.ПолучитьОбъект();
    ТекОбъект.<ИмяРеквизита> = Стр.<ИмяКолонкиСНужнымЗначением>;
    ТекОбъкт.Записать();

    КонецЦикла;

    Если в обработчике события "ПриЗаписи()" для элемента справочника происходит передача мутабельного значения с клиента на сервер(или обратно), то необходимо править код обработчика события, ибо код не верен для клиент-серверного варианта работы БД.
    kogor нравится это.

Поделиться этой страницей