|
Как функции модуля документа поместить в общий модуль? | ☑ | ||
|---|---|---|---|---|
|
0
Parti
07.09.09
✎
12:53
|
В модуле формы документа есть функция по расчету цены. По кнопке автоматически проставляются цены для номенклатуры из регСведений. В табличной части документа есть макет Excel и цены проставляются в него, перебором всех его ячеек.
Необходимо сделать обработку, которая "вызывала" бы эту функцию у всех документов и проставляла бы всем цены так же из РегСведений. Как это лучше реалзовать? Оставить в моделу формы документа эту функцию и как-то запускать её или перекопировать её в общий модуль и оттуда управлять всеми элементами? |
|||
|
1
Irbis
07.09.09
✎
12:54
|
Сделать функцию "Экспорт"; перебирая нужные документы, вызывать функцию.
|
|||
|
2
Ненавижу 1С
гуру
07.09.09
✎
12:56
|
либо в общий модуль, либо в модуль документа, но не формы
|
|||
|
3
Parti
07.09.09
✎
12:59
|
(1) я выбрал запросом нужные документы. И как мне запустить экспортную функцию только для этого документа?
|
|||
|
4
Irbis
07.09.09
✎
13:00
|
ДокументОбъект знает
|
|||
|
5
Parti
07.09.09
✎
13:02
|
(2) А модуль документа знает ЭлементыФОрмы?
|
|||
|
6
Irbis
07.09.09
✎
13:05
|
(5) В общем случае нет. Формы может и не быть вообще.
|
|||
|
7
Parti
07.09.09
✎
13:08
|
сделал процедуру Экспортной.
вот код Обработки: Процедура КнопкаВыполнитьНажатие(Кнопка) // Вставить содержимое обработчика. Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | ЗаявкаГод.Ссылка КАК Ссылка, | ЗаявкаГод.СогласованоПТС |ИЗ | Документ.ЗаявкаГод КАК ЗаявкаГод |ГДЕ | ЗаявкаГод.СогласованоПТС = ИСТИНА"; РезультатЗапроса = Запрос.Выполнить() ; Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Док = Выборка.Ссылка.ПроставитьЦены(); КОнецЦИкла; КонецПроцедуры так, нет? |
|||
|
8
Irbis
07.09.09
✎
13:11
|
Не так. Я же писал ДокументОбъект, а не ДокументСсылка!
|
|||
|
9
Parti
07.09.09
✎
13:14
|
(8)
Док = Выборка.ПолучитьОбъект().ПроставитьЦены(); ? |
|||
|
10
Irbis
07.09.09
✎
13:21
|
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.ПроставитьЦены(); // Если надо записать Если Док.Проведен Тогда Док.Записать(РежимЗаписиДокумента.Проведение); Иначе Док.Записать(РежимЗаписиДокумента.Запись); КонецЕсли; |
|||
|
11
Parti
07.09.09
✎
13:26
|
{Обработка.Обработка1.Форма.Форма(18)}: Метод объекта не обнаружен (ПроставитьЦены)
Док.ПроставитьЦены(); |
|||
|
12
Irbis
07.09.09
✎
13:27
|
В модуле объекта должна быть процедура или функция ПроставитьЦены() с пометкой Экспорт.
|
|||
|
13
Mitriy
07.09.09
✎
13:30
|
миста лучший отладчик?
думай иногда головой, не стесняйся... |
|||
|
14
Parti
07.09.09
✎
13:36
|
(12) ага.. а как a модуле объекта обращаться к Элементамформы?
Ссылка.ПолучитьФОрму() ? |
|||
|
15
Irbis
07.09.09
✎
13:37
|
(14) Никак не обращаться. Неправильно это.
|
|||
|
16
vvert
07.09.09
✎
13:39
|
(12) +1 не вижу это она "Экспортная"
|
|||
|
17
Parti
07.09.09
✎
13:44
|
(16) Она была в модуле формы. В модуле она не работает.
(15) Хорошо. А как мне получить доступ к макету, который размещен в ТП на форме документа? |
|||
|
18
Irbis
07.09.09
✎
13:51
|
А что другим способом получить данные из макета никак? Если там файл Excel с известной структурой, что мешает прочитать и разобрать файл, без использования визуальных объектов?
|
|||
|
19
Parti
07.09.09
✎
14:21
|
(18) смотри. На форме есть Табличное Поле(ТабДок). В него Вставлен макет Excel. Макет, я так понимаю, только макет. Все данные записываются в ТП. Как мне залезть в табличное поле документа из его общего модуля? Вот кусок кода, каким образом записывается в ТП данные:
Запрос1 = Новый Запрос; Запрос1.Текст ="ВЫБРАТЬ * |ИЗ | РегистрСведений.ЦеныНаГод КАК ЦеныНаГод |ГДЕ | (ЦеныНаГод.Материал = &Материал) И | (ЦеныНаГод.Год = &Год)"; Запрос1.УстановитьПараметр("Материал", Материал1); Запрос1.УстановитьПараметр("Год", ЗначВыб1.Год); Результат1 = Запрос1.Выполнить(); КолЗап1 = Результат1.Выбрать().Количество(); Выборка1 = Результат1.Выбрать(); Если КолЗап1 <> 0 Тогда Выборка1.Следующий(); Цена1 = Выборка1.Цена; Обл1 = "R" + Сч2 + "C8"; ЭлементыФормы.ТабДок.Область(Обл1).Значение = Цена1; Обл1 = "R" + Сч2 + "C7"; Результат1 = Цена1 * ЭлементыФормы.ТабДок.Область(Обл1).Значение; Обл1 = "R" + Сч2 + "C9"; ЭлементыФормы.ТабДок.Область(Обл1).Значение = Результат1; Для Сч1 = 1 По 12 Цикл Стлб1 = 12 + (Сч1 - 1) * 3; Стлб2 = 11 + (Сч1 - 1) * 3; Обл1 = "R" + Сч2 + "C" + Стлб1; Обл2 = "R" + Сч2 + "C" + Стлб2; Результат1 = Цена1 * ЭлементыФормы.ТабДок.Область(Обл2).Значение; ЭлементыФормы.ТабДок.Область(Обл1).Значение = Результат1 КонецЦикла КонецЕсли; |
|||
|
20
Irbis
07.09.09
✎
14:24
|
>> Все данные записываются в ТП - в корне неверно ТП - элемент визуализации данных. Что является источником данных для табличного поля?
|
|||
|
21
Irbis
07.09.09
✎
14:25
|
Обращайся к РС.
|
|||
|
22
Parti
07.09.09
✎
14:27
|
(20)ок. Ща гляну. Источником скорее всего является Табличная часть документа.
Просто док не я создавал, тут такого наверчено, сижу вот разбираюсь.. |
|||
|
23
Parti
07.09.09
✎
14:35
|
Как я понял: В табл части дока есть: материал, количество, тип, едИзм и пр. Нет цены. В ТП пользователем добавляется все это и по кнопке "Цены" проставляются цены из РС. Как выводятся - я пока не разобрался, но думаю, что так же из РС проставляются в соответствие материалам и времени установки цен.
Теперь же нужно сделать обработку, чтобы по ней цены проставлялись автоматически из РС. Для этого нужно залезть в ТП документа и как-то проставить их там.. |
|||
|
24
Irbis
07.09.09
✎
14:41
|
Неверное решение, если цены заполняются на основании данных РС, то и брать их при заполнении из модуля объекта следует по тому же самому алгоритму и из того же самого места, то есть из РС.
Еще раз повторяю ТП - элемент визуализации и никаких данных в себе не хранит. |
|||
|
25
Parti
07.09.09
✎
14:51
|
>> ТП - элемент визуализации и никаких данных в себе не хранит.
Не хранит. Но вывести-то их как-то нужно. Нужно, чтобы пользователю отображались цены и суммы в ТП документа. С модуля формы документа это сделать просто: ЭлементыФормы.ТабДок.Область(Обл2).Значение = Результат1 А вот с модуля документа это сделать сложнее.. Форма =Ссылка.ПолучитьОбъект().ПолучитьФорму("ФормаДокумента", ЭтаФОрма); Форма.ЭлементыФормы.Табдок // дальше никак.. |
|||
|
26
Irbis
07.09.09
✎
15:03
|
(25) А зачем это делать из модуля? Пусть форма отрабатывает свои методы, а объект свои. Получение данных - забота объекта, отображение - формы. В конце концов передай в модуль объекта элемент формы, то же самое ТП. И хоть обзаполняйся там.
|
|||
|
27
Parti
07.09.09
✎
15:13
|
Irbis, ты самый терпеливый! Спасибо тебе. Буду думать над задачей..
|
|||
|
28
Irbis
07.09.09
✎
15:15
|
Так что все-таки является источником данных для ТП?
|
|||
|
29
Parti
07.09.09
✎
15:24
|
Хороший вопрос. Наверно все-таки Табличная Часть документа. ТП служит для ввода данных и вывода их на экран... если честно, у меня уже болит голова разбираться с их кодом.. вот только одна процедура :
Процедура ПриОткрытии() //04.09.09 <прогер3> Интеррактивное изменение доступности форм в зависимости от прав пользователя ЭлементыФОрмы.Флажок1.Доступность=Ложь; ЭлементыФОрмы.Флажок2.Доступность = Ложь; ЭлементыФОрмы.КомментарийПТС.Доступность = ЛОЖЬ; ЭлементыФОрмы.КомметарийОМТСиМ.Доступность = Ложь; ЭлементыФОрмы.Комментарий.Доступность = Истина; ЭлементыФОрмы.Комментарий.Доступность = Истина; Если РольДоступна("ПТС") Тогда ЭлементыФОрмы.Флажок1.Доступность=ИСТИНА; ЭлементыФОрмы.КомментарийПТС.Доступность = Истина; КОнецЕсли; Если РольДоступна("ОМТСиМ") Тогда ЭлементыФОрмы.Флажок2.Доступность = ИСТИНА; ЭлементыФОрмы.КомметарийОМТСиМ.Доступность = ИСТИНА; КОнецЕсли; //КОнецФрагмента <прогер3> ЭлементыФормы.ТабДок.Вывести(ОбластьШапка); ЭлементыФормы.ТабДок.ФиксацияСверху=3; ЭлементыФормы.ТабДок.ФиксацияСлева=9; ЭлементыФормы.ТабДок.ТолькоПросмотр=Истина; СтарыйОбъектВид = NULL; СтарыйМатериал = NULL; СтарыйМатериалМарка = NULL; Комментарий1 = NULL; Сдвиг = 10; СчВыведенныхСтрок = 3; ВыводСледующейСтроки = истина; СчСтрокТабличнойЧасти = 0;//20.08.2009 <прогер1>. Счетчик обработанных строк табличной //части документа, через каждые 12 строчек должен сбрасываться //сброс счетчика должен означать вывод новой строки с материалом ПрГр1 = 0; // Добавил <прогер2> И.В. 13.05.2009 - это для создания итогов. Для Каждого строка Из ТаблицаМатериалов Цикл СчСтрокТабличнойЧасти = СчСтрокТабличнойЧасти + 1; //20.08.2009 <прогер1> // Добавил <прогер2> И.В. 13.05.2009 - для итогов // --- Начало фрагмента --- ФлагИтога1 = Ложь; Если ПрГр1 = 0 Тогда ПрГр1 = Строка.Группа; КонецЕсли; Если ПрГр1 <> Строка.Группа Тогда ПрГр1 = Строка.Группа; ФлагИтога1 = Истина; КонецЕсли; // --- Конец фрагмента --- Если СтарыйОбъектВид = NULL Тогда СтарыйОбъектВид = Строка.ОбъектВид; ОбластьОбъектВид.Параметры.ОбъектВид = Строка.ОбъектВид; ЭлементыФормы.ТабДок.Вывести(ОбластьОбъектВид); СчВыведенныхСтрок = СчВыведенныхСтрок + 1; КонецЕсли; Если СтарыйОбъектВид <> Строка.ОбъектВид Тогда СтарыйОбъектВид = Строка.ОбъектВид; ОбластьОбъектВид.Параметры.ОбъектВид = Строка.ОбъектВид; ЭлементыФормы.ТабДок.Вывести(ОбластьОбъектВид); СчВыведенныхСтрок = СчВыведенныхСтрок + 1; КонецЕсли; // <прогер2> И.В. 14.03.2009 - для вывода подгрупп и невывода пустого материала // --- Начало фрагмента --- Если Строка.Материал = Справочники.Материалы.ПустаяСсылка() Тогда КонецЕсли; // --- Конец фрагмента --- Если СтарыйМатериал = NULL Тогда СтарыйМатериал = Строка.Материал; СтарыйМатериалМарка = Строка.Материал.Тип; Комментарий1 = Строка.Комментарий; ПланГод = 0; КоличествоГод = 0; КонецЕсли; // <прогер2> И.В. xx.03.2009 // --------------------------- // Здесь названия материалов совпадали - различия только в марке // Т.е. надо контролировать различие не материалов, а марки! // Плюс оказывается надо контролировать комментарии - // в них идентификатор одинаковых по типу (марке) материалов. // Этот момент в программе я уже исправил - ниже исправленный код. // <прогер1> Р.А. 20.08.2009 Закоментировал всвязи со сложностью проверок, например // если комментарий пустой? //Если (СтарыйМатериал <> Строка.Материал) ИЛИ // (СтарыйМатериалМарка <> Строка.Материал.Тип) ИЛИ // (Комментарий1 <> Строка.Комментарий) Если СчСтрокТабличнойЧасти >12 // <прогер1> Р.А. 20.08.09 так мне кажется проще всего // Все равно по 12 строк табличной части на 1 материал // Приходится Тогда СчСтрокТабличнойЧасти = 1; ВыводСледующейСтроки = Истина; СтарыйМатериал = Строка.Материал; СтарыйМатериалМарка = Строка.Материал.Тип; Комментарий1 = Строка.Комментарий; ПланГод = 0; КоличествоГод = 0; Сдвиг = 10; КонецЕсли; // Добавил <прогер2> И.В. 13.05.2009 - вывод итогов // --- Начало фрагмента --- Если ФлагИтога1 = Истина Тогда СчВыведенныхСтрок = СчВыведенныхСтрок + 1; КонецЕсли; // --- КонецФрагмента --- Если ВыводСледующейСтроки Тогда // <прогер2> И.В. 14.05.2009 для вывода нескольких групп добавил это условие // Без условия несколько групп не выводится - надо оставить то, что внутри Если Если Строка.Материал <> Справочники.Материалы.ПустаяСсылка() Тогда ОбластьСтрока.Область("R1C1").Расшифровка = Строка.ОбъектВид; ОбластьСтрока.Параметры.Материал = СокрЛП(Строка.Материал) + " "+СокрЛП(Строка.Материал.Тип)+" "+СокрЛП(Строка.Материал.Параметры); ОбластьСтрока.Область("R1C2").Расшифровка=Строка.Материал; //ОбластьСтрока.Параметры.Гост = Строка.Материал.ГОСТ; ОбластьСтрока.Область("R1C4").Текст = Строка.Материал.БазоваяЕдиницаИзмерения; ОбластьСтрока.Параметры.Норма = Строка.НормаНаЕдиницу; // ОбластьСтрока.Область("R1C13").Текст = Строка.Комментарий; ОбластьСтрока.Область("R1C4").Расшифровка=Строка.Материал.БазоваяЕдиницаИзмерения; ЭлементыФормы.ТабДок.Вывести(ОбластьСтрока); СчВыведенныхСтрок = СчВыведенныхСтрок + 1; ВыводСледующейСтроки = Ложь; КонецЕсли; КонецЕсли; Если Не ВыводСледующейСтроки Тогда Попытка КолонкаПлан = Сдвиг; КолонкаКоличество = Сдвиг+1; ЭлементыФормы.ТабДок.Область("R"+Строка(СчВыведенныхСтрок)+"C"+Строка(КолонкаПлан)).Значение = Строка.ПланируемыйОбъем; ЭлементыФормы.ТабДок.Область("R"+Строка(СчВыведенныхСтрок)+"C"+Строка(КолонкаКоличество)).Значение = Строка.Количество; ПланГод = ПланГод + Строка.ПланируемыйОбъем; КоличествоГод = КоличествоГод + Строка.Количество; ЭлементыФормы.ТабДок.Область("R"+Строка(СчВыведенныхСтрок)+"C6").Значение = ПланГод; ЭлементыФормы.ТабДок.Область("R"+Строка(СчВыведенныхСтрок)+"C7").Значение = КоличествоГод; Исключение Сообщить("R"+Строка(СчВыведенныхСтрок)+"C"+Строка(КолонкаПлан)); Сообщить(Строка.Материал); Сообщить(Строка.Материал.Тип); КонецПопытки; Сдвиг = Сдвиг + 3; КонецЕсли; КонецЦикла; //--- Добавил <прогер2> И.В. 03.08.2009 --- //--- Фрагмент подставляет цены --- //--- Начало фрагмента --- //Закомментировал <прогер1> 20.08.2009 //Что это? зачем нам тогда нам нужен регистр цен? //ЗначВыб1 = Ссылка.ПолучитьОбъект().ДокЦены; //Если ЗначВыб1 <> Документы.ЗаявкаГод.ПустаяСсылка() Тогда // Пробегаем по всем строкам документа Сч2 = 4; Значение1 = "Непустое_значение"; Пока (Значение1 <> "") Цикл Сч2 = Сч2 + 1; Обл1 = "R" + Сч2 + "C4"; ЕдИзм1 = ЭлементыФормы.ТабДок.Область(Обл1).Текст; Обл1 = "R" + Сч2 + "C2"; Значение1 = ЭлементыФормы.ТабДок.Область(Обл1).Текст; Если (Значение1 <> "") И (ЕдИзм1 <> "") Тогда Материал1 = ЭлементыФормы.ТабДок.Область(Обл1).Расшифровка; Запрос1 = Новый Запрос; Запрос1.Текст ="ВЫБРАТЬ * |ИЗ | РегистрСведений.ЦеныНаГод КАК ЦеныНаГод |ГДЕ | (ЦеныНаГод.Материал = &Материал) И | (ЦеныНаГод.Год = &Год)"; Запрос1.УстановитьПараметр("Материал", Материал1); Запрос1.УстановитьПараметр("Год", ПериодПланирования);//Дату берем прямо из екщего документа Результат1 = Запрос1.Выполнить(); КолЗап1 = Результат1.Выбрать().Количество(); Выборка1 = Результат1.Выбрать(); Если КолЗап1 <> 0 Тогда Выборка1.Следующий(); Цена1 = Выборка1.Цена; Обл1 = "R" + Сч2 + "C8"; ЭлементыФормы.ТабДок.Область(Обл1).Значение = Цена1; Обл1 = "R" + Сч2 + "C7"; Результат1 = Цена1 * ЭлементыФормы.ТабДок.Область(Обл1).Значение; Обл1 = "R" + Сч2 + "C9"; ЭлементыФормы.ТабДок.Область(Обл1).Значение = Результат1; Для Сч1 = 1 По 12 Цикл Стлб1 = 12 + (Сч1 - 1) * 3; Стлб2 = 11 + (Сч1 - 1) * 3; Обл1 = "R" + Сч2 + "C" + Стлб1; Обл2 = "R" + Сч2 + "C" + Стлб2; Результат1 = Цена1 * ЭлементыФормы.ТабДок.Область(Обл2).Значение; ЭлементыФормы.ТабДок.Область(Обл1).Значение = Результат1 КонецЦикла КонецЕсли; КонецЕсли КонецЦикла; ЭтаФорма.ЭлементыФормы.КоманднаяПанель2.Кнопки.Формулы.Доступность = Ложь //КонецЕсли // Удалил <прогер1> // --- Конец фрагмента --- КонецПроцедуры |
|||
|
30
Irbis
07.09.09
✎
15:26
|
Не читая (29) до конца, а что в свойствах табличного поля написано? Неужели сложно посмотреть?
|
|||
|
31
Irbis
07.09.09
✎
15:28
|
А так, камменты рулят.
|
|||
|
32
Parti
07.09.09
✎
15:31
|
Процедура ТабДокПриИзмененииСодержимогоОбласти(Элемент, Область)
// Вставить содержимое обработчика. Если Область.СодержитЗначение тогда Если СокрЛП(ТипЗнч(Область.Значение))="Число" Тогда ПозицияR = Найти(Область.Имя,"C"); ИмяОбластиСтроки = Лев ( Область.Имя, ПозицияR -1); //Обновим цену и сумму для измененного столбца //Добавил <Прогер1> Р.А. 20.08.2009 СтолбецСумма = Число(Прав (Область.Имя,СтрДлина(Область.Имя)-ПозицияR))+1; Материал = ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C2").Расшифровка; ЦенаМатериала = ЦенаМатериалаГод (Материал, ПериодПланирования); ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C8").Значение = ЦенаМатериала; ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C"+Строка(СтолбецСумма)).Значение = Область.Значение * ЦенаМатериала; //Конец фрагмента СчМес = 0; Сдвиг = 10; ПланГод = 0; КоличествоГод = 0; СуммаГод = 0; // Добавил <Прогер1> Р.А. 20.08.2009 для обновления информации по //суммам при изменеии количества Пока СчМес <=11 Цикл КолонкаПлан = Сдвиг; КолонкаКоличество = Сдвиг + 1; КолонкаСумма = Сдвиг + 2;// Добавил <Прогер1> Р.А. 20.08.2009 для обновления информации по //суммам при изменеии количества ПланГод = ПланГод + ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C"+Строка(КолонкаПлан)).Значение; КоличествоГод = КоличествоГод + ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C"+Строка(КолонкаКоличество)).Значение; // Добавил <Прогер1> Р.А. 20.08.2009 для обновления информации по //суммам при изменеии количества // Обновим суммы во всех столбцах, вдруг цены не было на момент добавления этой позиции ранее ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C"+Строка(КолонкаСумма)).Значение = ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C"+Строка(КолонкаКоличество)).Значение * ЦенаМатериала; СуммаГод = СуммаГод + ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C"+Строка(КолонкаСумма)).Значение; // Конец фрагмента Сдвиг = Сдвиг + 3; СчМес = СчМес + 1; КонецЦикла; ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C6").Значение = ПланГод; ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C7").Значение = КоличествоГод; // Добавил <Прогер1> Р.А. 20.08.2009 для обновления информации по //суммам при изменеии количества ЭлементыФормы.ТабДок.Область(ИмяОбластиСтроки+"C9").Значение = СуммаГод; КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
|
33
Irbis
07.09.09
✎
15:36
|
Пхоже что источник данных - табличный документ. Пусть его функция и возвращает, но ИМХО тупость такой реализации неимоверна.
|
|||
|
34
Parti
07.09.09
✎
15:39
|
(33) это еще немного. Чтобы во всем модуле разобраться, нужно вселенское терпение и мудрость предков.. Надеюсь не поседеть к тому времени.
Буду потихоньку разбираться, авось что-нить придумаю:) |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |