Табличная часть "ТаблицаЦен" документа "Установка цен номенклатуры".
Добрый день. Обычные формы.
Пытаюсь реализовать заполнение табличной части документа "Установка цен номенклатуры" с помощью внешней обработки из файла Excel. Прикладываю код модуля объекта обработки:
Так как у документа основная таблица формы реализована как реквизит, то столкнулся со следующей проблемой.
Для того, что бы мои данные из Excel появились в документе, необходимо форму документ закрыть и открыть заново.
Если Программно "Закрыть()", а после "Открыть()", то натыкаюсь на ошибку при открытии "ФормыДокумента" в процедуре УстановитьКнопкиПодменюЗаполненияТЧ(); => Процедура ОбработатьНажатиеНаДополнительнуюКнопкуЗаполненияТЧ(СтрокаКнопки,ЭтотОбъект) Экспорт
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(310)}: Ошибка при вызове метода контекста (Добавить)
Кнопка = Кнопки.Добавить(СтрокаКнопки.Имя,СтрокаКнопки.ТипКнопки, СтрокаКнопки.Текст, СтрокаКнопки.Действие);
по причине:
Не уникальное имя!
Подскажите как это обойти, или может вообще есть способ без закрытия-открытия формы ?!
Пытаюсь реализовать заполнение табличной части документа "Установка цен номенклатуры" с помощью внешней обработки из файла Excel. Прикладываю код модуля объекта обработки:
Процедура Инициализировать(ДокументСсылка, ИмяТабличнойЧасти, ТабличноеПолеОбъекта = Неопределено) Экспорт
ТЧТовары = ДокументСсылка["Товары"];
Если ТЧТовары.Количество() > 0 Тогда
ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , Метаданные().Представление());
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ТЧТовары.Очистить();
КонецЕсли;
ДокументСсылка.Дата = ТекущаяДатаСеанса();
Если ПолучитьФорму("Форма").ОткрытьМодально() = "ОК" Тогда
Для Каждого Строка из Таблица Цикл
НоваяСтрока = ТЧТовары.Добавить();
Переменная = Справочники.Номенклатура.НайтиПоНаименованию(Строка["Наименование"],Истина);
Если ЗначениеЗаполнено(Переменная) Тогда
НоваяСтрока["Номенклатура"] = Справочники.Номенклатура.НайтиПоНаименованию(Строка["Наименование"],Истина);
НоваяСтрока["Цена"] = Строка["Цена"];
Для Каждого Стр из ДокументСсылка.ТипыЦен Цикл
НоваяСтрока["ТипЦен"] = Стр.ТипЦен;
НоваяСтрока["Валюта"] = Стр.ТипЦен.ВалютаЦены;
КонецЦикла;
НоваяСтрока["ЕдиницаИзмерения"] = Справочники.Номенклатура.НайтиПоНаименованию(Строка["Наименование"],Истина).ЕдиницаИзмеренияМест;
Иначе
ТЧТовары.Удалить(НоваяСтрока);
Сообщить(" В базе отсутствует номенклатура: " + Строка["Наименование"] + " с кодом : " + Строка["Код"]);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ДокументСсылка.Записать();
ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
ТекФорма.Закрыть();
//ОткрытьФорму(ТекФорма);
КонецПроцедуры
ПоказатьТак как у документа основная таблица формы реализована как реквизит, то столкнулся со следующей проблемой.
Для того, что бы мои данные из Excel появились в документе, необходимо форму документ закрыть и открыть заново.
Если Программно "Закрыть()", а после "Открыть()", то натыкаюсь на ошибку при открытии "ФормыДокумента" в процедуре УстановитьКнопкиПодменюЗаполненияТЧ(); => Процедура ОбработатьНажатиеНаДополнительнуюКнопкуЗаполненияТЧ(СтрокаКнопки,ЭтотОбъект) Экспорт
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(310)}: Ошибка при вызове метода контекста (Добавить)
Кнопка = Кнопки.Добавить(СтрокаКнопки.Имя,СтрокаКнопки.ТипКнопки, СтрокаКнопки.Текст, СтрокаКнопки.Действие);
по причине:
Не уникальное имя!
Подскажите как это обойти, или может вообще есть способ без закрытия-открытия формы ?!
По теме из базы знаний
Найденные решения
(14) не надо программно вызывать "Закрыть()" и "Открыть()".
Достаточно посмотреть в процедуре ПриОткрытии() как заполняется реквизит документа ТаблицаЦен.
Достаточно посмотреть в процедуре ПриОткрытии() как заполняется реквизит документа ТаблицаЦен.
ДокументСсылка.Записать();
//==========================================================
ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
мСоответствиеТиповЦен = Новый Соответствие;
Для Каждого СтрокаТипаЦен Из ДокументСсылка.ТипыЦен Цикл
НомерСоответствияТекущейКолонки = ДокументСсылка.ТипыЦен.Индекс(СтрокаТипаЦен);
мСоответствиеТиповЦен.Вставить(СтрокаТипаЦен.ТипЦен, НомерСоответствияТекущейКолонки);
КонецЦикла;
Если ДокументСсылка.ТипыЦен.Количество() = 0 Тогда // ничего делать не надо
Возврат;
КонецЕсли;
ТаблицаТоваров = ДокументСсылка.Товары.Выгрузить();
ТаблицаТоваров.Сортировать("ИндексСтрокиТаблицыЦен, Номенклатура, ХарактеристикаНоменклатуры");
ТекущийИндексСтрокиТаблицыЦен = Неопределено;
НоваяСтрока = Неопределено;
Для Каждого СтрокаТаблицыТоваров Из ДокументСсылка.Товары Цикл
Если ТекущийИндексСтрокиТаблицыЦен <> СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен
Или НоваяСтрока.Номенклатура <> СтрокаТаблицыТоваров.Номенклатура
Или НоваяСтрока.ХарактеристикаНоменклатуры <> СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры Тогда
НоваяСтрока = ТекФорма.ТаблицаЦен.Добавить();
НоваяСтрока.Номенклатура = СтрокаТаблицыТоваров.Номенклатура;
НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры;
ТекущийИндексСтрокиТаблицыЦен = СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен;
КонецЕсли;
НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТаблицыТоваров.ТипЦен];
НоваяСтрока["цена" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Цена;
НоваяСтрока["СпособРасчета" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.СпособРасчетаЦены;
НоваяСтрока["валюта" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Валюта;
НоваяСтрока["единица" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ЕдиницаИзмерения;
НоваяСтрока["процент" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ПроцентСкидкиНаценки;
КонецЦикла;
ТекФорма.ЭлементыФормы.ТаблицаЦен.СоздатьКолонки();
//==========================================================
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(8) Ругается мол поле объекта не обнаружено. Как обратиться к нему подскажите пожалуйста.
Так ?
ТаблицаЦен = ДокументСсылка[ТабличноеПолеОбъекта.Значение];
Просто логика такая, что сперва заполняется тч объекта "Товары" . А потом уже передаётся в тч реквизит формы "ТаблицаЦен".
То есть у "ТаблицаЦен" нету поля "цена" даже к примеру. Как его заполнять ? запутался..
Так ?
ТаблицаЦен = ДокументСсылка[ТабличноеПолеОбъекта.Значение];
Просто логика такая, что сперва заполняется тч объекта "Товары" . А потом уже передаётся в тч реквизит формы "ТаблицаЦен".
То есть у "ТаблицаЦен" нету поля "цена" даже к примеру. Как его заполнять ? запутался..
(14) не надо программно вызывать "Закрыть()" и "Открыть()".
Достаточно посмотреть в процедуре ПриОткрытии() как заполняется реквизит документа ТаблицаЦен.
Достаточно посмотреть в процедуре ПриОткрытии() как заполняется реквизит документа ТаблицаЦен.
ДокументСсылка.Записать();
//==========================================================
ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
мСоответствиеТиповЦен = Новый Соответствие;
Для Каждого СтрокаТипаЦен Из ДокументСсылка.ТипыЦен Цикл
НомерСоответствияТекущейКолонки = ДокументСсылка.ТипыЦен.Индекс(СтрокаТипаЦен);
мСоответствиеТиповЦен.Вставить(СтрокаТипаЦен.ТипЦен, НомерСоответствияТекущейКолонки);
КонецЦикла;
Если ДокументСсылка.ТипыЦен.Количество() = 0 Тогда // ничего делать не надо
Возврат;
КонецЕсли;
ТаблицаТоваров = ДокументСсылка.Товары.Выгрузить();
ТаблицаТоваров.Сортировать("ИндексСтрокиТаблицыЦен, Номенклатура, ХарактеристикаНоменклатуры");
ТекущийИндексСтрокиТаблицыЦен = Неопределено;
НоваяСтрока = Неопределено;
Для Каждого СтрокаТаблицыТоваров Из ДокументСсылка.Товары Цикл
Если ТекущийИндексСтрокиТаблицыЦен <> СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен
Или НоваяСтрока.Номенклатура <> СтрокаТаблицыТоваров.Номенклатура
Или НоваяСтрока.ХарактеристикаНоменклатуры <> СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры Тогда
НоваяСтрока = ТекФорма.ТаблицаЦен.Добавить();
НоваяСтрока.Номенклатура = СтрокаТаблицыТоваров.Номенклатура;
НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры;
ТекущийИндексСтрокиТаблицыЦен = СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен;
КонецЕсли;
НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТаблицыТоваров.ТипЦен];
НоваяСтрока["цена" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Цена;
НоваяСтрока["СпособРасчета" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.СпособРасчетаЦены;
НоваяСтрока["валюта" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Валюта;
НоваяСтрока["единица" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ЕдиницаИзмерения;
НоваяСтрока["процент" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ПроцентСкидкиНаценки;
КонецЦикла;
ТекФорма.ЭлементыФормы.ТаблицаЦен.СоздатьКолонки();
//==========================================================
Показать
(19) в самом конце моего кода, после создания колонок:
мПоказыватьКод = ВосстановитьЗначение("УстановкаЦенНоменклатуры_ПоказыватьКод");
мПоказыватьАртикул = ВосстановитьЗначение("УстановкаЦенНоменклатуры_ПоказыватьАртикул");
мПоказыватьКод = ?(мПоказыватьКод = Неопределено, Ложь, мПоказыватьКод);
мПоказыватьАртикул = ?(мПоказыватьАртикул = Неопределено, Ложь, мПоказыватьАртикул);
мКолонкиТовары = ТекФорма.ЭлементыФормы.ТаблицаЦен.Колонки;
мКолонкиТовары.Код.Видимость = мПоказыватьКод;
мКолонкиТовары.Артикул.Видимость = мПоказыватьАртикул;
(22) Хм и если ещё раз заполнять документ из обработки, то ТЧ не очищается. Этот кусок не работает выходит
То есть ТЧтовары очищает. Но тч ТаблицаЦен нет.
P.S. Всё-таки очищает, но данные обновляются только после переоткрытия формы...
Если ТЧТовары.Количество() > 0 Тогда
ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , Метаданные().Представление());
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ТЧТовары.Очистить();
КонецЕсли;
ПоказатьТо есть ТЧтовары очищает. Но тч ТаблицаЦен нет.
P.S. Всё-таки очищает, но данные обновляются только после переоткрытия формы...
(27) Ну вообще при создании документа "Код" и "Артикул" уже сразу есть. Так стало после того как я добавил ваш код в обработку для всех документов "Установка цен номенклатуры". Благо это копия базы.
Это появилось после того, как я создал документ, выбрал тип цен. Открыл свою обработку, выбрал Excel ,данные попали в таблицу на моей форме обработки.Потом нажал перенести в документ. Отработал мой код и появились "Код" и "Артикул",в том числе и для всех документов так стало.
В оригинале если создавать документ. То есть только две колонки "№" и "Номенклатура". При выборе цен появляются только Колонки - ТипЦен.СпособРасчета.Валюта.Единица и % скидки.
Это появилось после того, как я создал документ, выбрал тип цен. Открыл свою обработку, выбрал Excel ,данные попали в таблицу на моей форме обработки.Потом нажал перенести в документ. Отработал мой код и появились "Код" и "Артикул",в том числе и для всех документов так стало.
В оригинале если создавать документ. То есть только две колонки "№" и "Номенклатура". При выборе цен появляются только Колонки - ТипЦен.СпособРасчета.Валюта.Единица и % скидки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот