Вход | Регистрация
 

УТ 11.4 некорректное отображение программно созданного док."Установка цен номенклатуры"

УТ 11.4 некорректное отображение программно созданного док."Установка цен номенклатуры"
Я
   Admin_Net_1C
 
13.05.20 - 13:45
Добрый день.
Вопрос к гуру УТ 11.4: создаю программно документ "Установка цен номенклатуры"

&НаКлиенте
Процедура Вып()
лФорма = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта");
лДанныеФормы = лФорма.Объект;
...
ЗаполнитьДокументУстановкаЦенНоменклатурыНаСервере(лДанныеФормы);
...

КопироватьДанныеФормы(лДанныеФормы, лФорма.Объект);
    
лФорма.Открыть();

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


В самой процедуре ЗаполнитьДокументУстановкаЦенНоменклатурыНаСервере создаю ДокументОбъект.УстановкаЦенНоменрклатуры и заполняю его табличные части Товары и ВидыЦен. Сам документ НЕ записываю (т.к. нужно открыть заполненную форму нового документа).
После открытия получаю "пустую" форму документа.
Начал разбираться. Выяснил, что на форме документа отображается не сама ТЧ Товары, а реквизит формы ДеревоЦен, который заполняется/перезаполняется с помощью процедур/функций общего модуля УстановкаЦенСервер. И практически у всех экспортных процедур данного модуля первым параметром Форма (УправляемаяФорма), которая из модуля формы передается с помощью ключевого идентификатора ЭтаФорма.

Вопрос: как во внешней обработке "обойти" эту хрень? )) (для тех кто не понял - в обработке я не могу получить ЭтаФорма созданного документа)
   yzimin
 
1 - 13.05.20 - 14:10
Нужно ещё таблицу НаборыЗначенийДоступа заполнить

Создай документ вручную и посмотри что и как заполняется
   Admin_Net_1C
 
2 - 13.05.20 - 14:17
(1) заполнение этой табличной части никак не меняет ситуацию Суть проблемы в том, что у меня реквизит ДеревоЦен не заполняется программно, а заполняются только реквизиты и ТЧ объекта. А на форме отображается именно реквизит ДеревоЦен....
   Admin_Net_1C
 
3 - 13.05.20 - 14:18
(0) неужели никто не заморачивался с программным созданием данного документа и последующим открытием формы вновь созданного (НО не сохраненного!) документа?
   AAA
 
4 - 14.05.20 - 04:27
Насколько я помню, надо заполнить все зависимые цены. Года полтора назад делал, подзабыл. Могу выслать кусок обработки, но в той УТ были небольшие доработки в части обсуждаемого документа. 1С действительно везде заполняет это дерево, таскает по модулям форму,работает это медленно. Заполнять лучше данные документа и все потом нормально откроется )
   Admin_Net_1C
 
5 - 14.05.20 - 06:20
(4) буду признателен, если вышлите на почту в профиле
   AAA
 
6 - 14.05.20 - 08:08
выслал
   Admin_Net_1C
 
7 - 14.05.20 - 08:25
(6) благодарю.
Еще раз обращаю внимание, что проблема в том, когда программно создаем документ !и не записывая его!, открываем его форму. (При открытии уже записанного документа проблем нет))
   AAA
 
8 - 14.05.20 - 08:41
Значит надо программно построить дерево, которое строится при открытии документа
А в чем острая необходимость не записывать ?
   Admin_Net_1C
 
9 - 14.05.20 - 09:26
(8) логично, только для этого нужно переписать практически весь общий модуль УстановкаЦенСервер ну или ваять свой велосипед)
Острая необходимость проистекает из заданного ТЗ )
   NecroDog
 
10 - 14.05.20 - 10:02
Как вариант костыля - Сделать в этой форме какую-нибудь экспортную клиентскую функцию, которая вызовет сервер и оттуда уже вызовет общие модули и все остальное. Правда эту функцию кто угодно и откуда угодно сможет вызывать..
   Admin_Net_1C
 
11 - 14.05.20 - 10:58
(10) да, тоже уже думал над этим вариантом. Но другое ограничение ТЗ - документ снимать с поддержки нельзя, про вариант с расширением знаю, но тоже в данном случае не подходит. Собственно сабж был создан для того чтобы помогли подтвердить или опровергнуть мои выводы. Всем спасибо за участие )
   opus70
 
12 - 14.05.20 - 11:02
(3) вот рабочий код 2 дня назд преносил из 7.7 через OLE
    З = Новый Запрос("ВЫБРАТЬ
                     |    Номенклатура.Ссылка КАК Ссылка,
                     |  Номенклатура.Код Как КодТовара,
                     |  0 Как ЦенаЗакупочная,
                     |  0 Как ЦенаРозничная
                     |ИЗ
                     |    Справочник.Номенклатура КАК Номенклатура
                     |ГДЕ
                     |    Номенклатура.ЭтоГруппа = ЛОЖЬ");
    ТЗнЦены = З.Выполнить().Выгрузить();
    
    _ДатаЦены = ПолучитьРабочуюДату1();
    СпрИст = База77.EvalExpr("СоздатьОбъект(""Справочник.Номенклатура"")"); 
    СпрИстЦ= База77.EvalExpr("СоздатьОбъект(""Справочник.Цены"")");
    Для каждого СтрТЧ Из ТзнЦены Цикл
        если СпрИст.найтиПоКоду(Число(СтрТЧ.КодТовара))=0 Тогда
            Продолжить;
        конецесли;
        СпрИстЦ.ИспользоватьВладельца(СпрИст.ТекущийЭлемент());
        СпрИстЦ.выбратьЭлементы();
        СпрИстЦ.ИспользоватьДату(База77.EvalExpr("ТекущаяДата()"));
        Пока СпрИстЦ.ПолучитьЭлемент()=1 Цикл
            если СокрЛП(СпрИстЦ.ТипЦен.наименование) ="Закупочные" ТОгда
                СтрТЧ.ЦенаЗакупочная =СпрИстЦ.Цена;
            Иначе
                СтрТЧ.ЦенаРозничная =СпрИстЦ.Цена;
            Конецесли;
        Конеццикла;
    Конеццикла;
    
    _ВидЦены =Справочники.ВидыЦен.НайтиПоНаименованию("Закупочные");
    НовДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    НовДок.Дата = ПолучитьРабочуюДату1();
    НовДок.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
    НовДок.Согласован = Истина;
    НовСтр = НовДок.ВидыЦен.Добавить();
    НовСтр.ВидЦены = _ВидЦены;
    Для каждого СтрТЧ Из  ТзнЦены Цикл
        если СтрТч.ЦенаЗакупочная=0 ТОгда
            Продолжить;
        конецесли;
        НовСтр = НовДок.Товары.Добавить();
        НовСтр.Номенклатура = СтрТЧ.Ссылка;
        НовСтр.Цена = стрТЧ.ЦенаЗакупочная;
        НовСтр.ЦенаИзмененаВручную=Истина;
        НовСтр.ВидЦены = _ВидЦены;
    Конеццикла;
    НовДок.Записать(РежимЗаписиДокумента.Запись);
   yzimin
 
13 - 14.05.20 - 11:55
(12) Надо без записи документа
   GreyK
 
14 - 14.05.20 - 12:56
ДанныеФормы2 - это объект документа.
Если ДанныеФормы2.Товары.Количество() > 0 Тогда
    КопироватьДанныеФормы(ДанныеФормы2, Форма2.Объект);
    Отбор = Новый Структура;
    Отбор.Вставить("Ссылка",ДанныеФормы2.ВидыЦен[0].ВидЦены);
    НайденныеСтроки = Форма2.ВыбранныеЦены.НайтиСтроки(Отбор);
    Для Каждого СтрокаВыбранныхЦен Из НайденныеСтроки Цикл
        СтрокаВыбранныхЦен.Выбрана = Истина;
    КонецЦикла;
    //Форма2.ВыбранныеЦеныИзменены = Истина;

    ////НоваяСтрокаЦен = Форма2.Элементы.ДеревоЦен.Загрузить(ДанныеФормы2.Товары.Выгрузить());

    Форма2.Открыть();
    Форма2.ЗаполнитьДокумент();
КонецЕсли;
   Admin_Net_1C
 
15 - 14.05.20 - 13:05
(15) в конфигурации без изменений процедура ЗаполнитьДокумент() документа УстановкаЦенНоменклатуры.ФормаДокумента не является экспортной...(
А так, да, как уже говорилось в (10),(11) - костыль рабочий )
   GreyK
 
16 - 14.05.20 - 13:18
(15) Код из (14) работает в Управление торговлей, редакция 11 (11.4.11.55), без изменений конфигурации.
   GreyK
 
17 - 14.05.20 - 13:20
+(14) Чтобы было понятно что и как.
 
Форма2 = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта");
ДанныеФормы2 = Форма2.Объект;
   Admin_Net_1C
 
18 - 14.05.20 - 13:25
(16) если не сложно посмотрите пожалуйста в УстановкаЦенНоменклатуры.ФормаДокумента модуле формы процедура ЗаполнитьДокумент() объявлена как экспортная?
   Admin_Net_1C
 
19 - 14.05.20 - 13:30
   GreyK
 
20 - 14.05.20 - 13:33
(18) Нет, не объявлена. Конфа на замке, расширения стоят только от 1с, в них документы не меняются.
   Admin_Net_1C
 
21 - 14.05.20 - 13:43
(20) тогда не понятно, как в обработке Вы обращаетесь к этой процедуре:
Форма2.ЗаполнитьДокумент();

???
   GreyK
 
22 - 14.05.20 - 13:58
(21) Команда выполняется на клиенте, данные заполняются на сервере, всё нормально отрабатывает. Я тоже долго с этим боролся, удачи!
   Admin_Net_1C
 
23 - 14.05.20 - 14:05
(22) Работает !!!  +100500 тебе в карму добрый человек ))
   Admin_Net_1C
 
24 - 14.05.20 - 14:16
Теперь вопрос к спецам по самому механизму: в модуле формы УстановкаЦенНоменклатуры.ФормаДокумента процедура ЗаполнитьДокумент() объявлена без ключевого слова Экспорт. Почему в таком случае во внешней обработке отрабатывает код:

лФорма = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта");
лДанныеФормы = лФорма.Объект;
    
Если ЗаполнитьДокументУстановкаЦенНоменклатурыНаСервере(лДанныеФормы, пРезультат) Тогда
    лФорма.ВыбранныеЦеныИзменены = Истина;
        
    лПараметрыОтбора = Новый Структура;
    лПараметрыОтбора.Вставить("Ссылка", пРезультат);
        
    лМассивНайденных = лФорма.ВыбранныеЦены.НайтиСтроки(лПараметрыОтбора);
    Если лМассивНайденных.Количество() > 0 Тогда
        лМассивНайденных[0].Выбрана = Истина;
    КонецЕсли;
        
    КопироватьДанныеФормы(лДанныеФормы, лФорма.Объект);
    лФорма.Открыть();

    лФорма.ЗаполнитьДокумент();  //--- Почему отрабатывает ЭТОТ КОД ???

        
КонецЕсли;


Во внешней обработке мы находимся вне контекста самого модуля формы (УстановкаЦенНоменклатуры.ФормаДокумента), а не экспортная процедура вызывается. Или я что-то не правильно понимаю? Может кто нибудь объяснить на пальцах )
   NecroDog
 
25 - 14.05.20 - 14:51
Вспомнил об упоминании такого на ИТС в рекомендациях по безопасности кода. Цитирую:
"Потенциальную угрозу безопасности представляют все серверные процедуры и функции, доступные для вызова из клиентского кода...[далее примеры]
Все процедуры и функции модулей форм объектов с директивами компиляции &НаСервере, &НаСервереБезКонтекста. Вызов таких процедур и функций доступен из контекста клиента после успешного получения формы, даже если эти процедуры и функции не экспортные. Это делает возможным вызов кода в контексте, который не предполагался разработчиком."
   NecroDog
 
26 - 14.05.20 - 15:03
Еще инфа: похоже, что это баг платформы, который можно использовать, если для конфигурации установлен режим совместимости с 8.3.12.
   GreyK
 
27 - 14.05.20 - 15:37
(24) Где здесь не соответствие? Для неоткрытых форм нужно объявление Экспорт, для открытых не нужно, иначе ни одна процедура или фукция общего модуля не сможет с открытой формой работать и вся БСП останется не удел :)
Так, что никакой ошибки здесь нет и режим совместимости не причём.
   NecroDog
 
28 - 14.05.20 - 16:00
(27) Только что проверил. В режиме совместимости 8.3.12 работает вызов серверного метода, а в режиме совместимости 8.3.13 уже не работает. И не важно, открыта эта форма или нет.
   GreyK
 
29 - 14.05.20 - 16:06
(28) Мы же не серверный метод используем, а клиентский.
   NecroDog
 
30 - 14.05.20 - 16:21
(29) У ЗаполнитьДокумент() директива компиляции &НаСервере. По крайней мере, в КА2 это так.
 
 Рекламное место пустует
   Klesk
 
31 - 14.05.20 - 16:29
(0) сравнивай консолью админа созданный вручную док и программно
   GreyK
 
32 - 14.05.20 - 16:42
(30) Лень конфигурацию с поддержки снимать, чтобы попробовать.
Поживем, увидим.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.