Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Не отображаются изменения на форме после заполнения табличной части реквизита

Пишу внешнюю обработку для заполнения табличной части документа Реализация товаров и услуг в Конфигурации УТ 11. Суть в том, что нужно скорректировать количество для каждой позиции номенклатуры в зависимости от того, сколько данного товара есть на складе.

Код модуля объекта самой обработки:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Корректировка количества товара в РТУ");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка для корректировки количества товара в табличной части документа Реализация товаров и услуг");
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Корректировка количества по остаткам", "КорректировкаКоличестваПоОстаткам", "ВызовКлиентскогоМетода", Истина);
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции
 
Функция ПолучитьТаблицуКоманд()
  Команды = Новый ТаблицаЗначений;
  Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
  Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
  Возврат Команды;
КонецФункции
 
Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;
КонецФункции
Здесь вопросов нет. При подключении обработки в форме документа добавляется кнопка "Заполнение / Корректировка количества по остаткам".

Дальше создаю в обработке форму и в модуле формы пишу следующий код:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
&НаКлиенте
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
    ДанныеФормыРТУОбъект = ВладелецФормы.Объект;
    ЗаполнитьОбъектНаСервере(ДанныеФормыРТУОбъект);
    КопироватьДанныеФормы(ДанныеФормыРТУОбъект, ВладелецФормы.Объект);        
    ВладелецФормы.Модифицированность = Истина;
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьОбъектНаСервере(ДанныеФормыОбъект)
    ТЧ = ДанныеФормыОбъект.Товары;
    Для Каждого Строка Из ТЧ Цикл
        // здесь будет запрос к регистру накопления ТоварыНаСкладахОстатки, чтобы узнать остатки товара
        // пока для наглядности пусть в документе будет каждого товара по одной штуке
        Строка.Количество = 1; 
    КонецЦикла;
КонецПроцедуры
Собственно и всё, а пользователь пусть сам решает сохранять ему документ или продолжить редактирование.

Вопрос лишь в том, что изменение количества в реквизите "Товары" никак не отображается на форме документа, то есть в данном конкретном случае пользователь после изменения объекта увидит не единички в поле "Количество", а прежнее количество. Кроме того, если нажать кнопку "Записать объект", закрыть и заново открыть документ, то там по-прежнему будет старое количество, а не единички.

Как это исправить?
Ответ: ещё немного полезной, на мой взгляд, информации в продолжение темы:

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

Доброго!
Ситуация, поставившая меня в тупик.
Имеем 1с 8.2 УФ
Имеем справочник "Работ"
Имеем документ с табличной частью, с реквизитом в табличной части "Работа"
Имеем справочник Регламентных работ, в каждом из элементов справочника есть табличная часть с реквизитом "Работа"(перечень работ - "набор работ")

Смысл всего задуманного - "пресеты", в конкретном случае "пресеты" работ с оборудованием заказчика.

Т.е. в идеале это команда на форме, с помощью которой открывается форма выбора элемента справочника(Регламентных работ), и в последствии происходит программное заполнение табличной части работ из табличной части справочника Регламентных работ.

Начинал создавать команду, но все время упираюсь в ошибки получения формы выбора...
На клиенте получается форму не получить...

Направьте, пожалуйста, начинающего на путь истинный.
Заранее спасибо
Ответ: GoodR, Это не рядом. Это вы сели в автомобиль и завели двигатель. Пока еще даже не трогались. Так что .... далеко не рядом.
В примере вам надо последний код, по тексту начинается с "Для завершения подбора создана команда формы, с обработчиком, выполняющим оповещение о выборе:" Вот это то что вам надо реализовать в своей базе
Вопрос: Автозаполнение из табличной части справочника в табличную часть документа

Здравствуйте , помогите пожалуйста с кодом
Мне нужно чтобы автоматически заполнялась табличная часть документа из табличной части справочника.
При заполнении документа , автоматически заполнялось ОстановкиМаршрута на 2 скрине.
Из справочника "Маршруты" в ней табличная часть "ОстановкиМаршрута" в "Документ1" в форму элемента "ОстановкиМаршрута"
Ответ: А если ТЧ справочника изменится, нужно ли менять ТЧ документа?

Добавлено через 3 минуты
Так нужно заполнять табличную часть документа? Или выводит список остановок при позиционировании на строке документа?
Вопрос: Заполнение табличной части документа данными из нескольких документов

Здравствуйте!
Столкнулась с такой проблемой. Имеется 2 документа: "Акт" и "Ведомость". Документ "Ведомость" создается на основании документа "Акт". Необходимо заполнить табличную часть документа "Ведомость" данными из табличных частей нескольких документов "Акт", созданных за неделю (платформа 8.2).
Подскажите, как это реализовать?
Ответ: Tatiana21, можете, можете и не у меня)
Вопрос: Автоматическое заполнение табличной части документа

Как программным способом заполнить табличную часть документа данными из справочника "Сотрудники"(тип Ссылка)?
В табличной части Работники Организации документа заполняются сотрудники, потом идут пустые значения, и снова сотрудники повторяются несколько раз. В списке сотрудников должно быть 4, но загружается 99990 строк.

Код ниже:

ВыбФайл = Новый Файл(ИмяФайла);
Если НЕ ВыбФайл.Существует() Тогда
Сообщить("Файл не существует!");
Возврат;
КонецЕсли;

Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяФайла);
// Состояние("Обработка файла Microsoft Excel...");
ExcelЛист = Excel.Sheets(1);
Исключение
Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
Возврат;

КонецПопытки;

Фл = 1;
НомСтр = 2;
// создаем документ Начисление зарплаты работникам организаций
НовДок = Документы.НачислениеЗарплатыРаботникамОрганизаций.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
НовДок.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
НовДок.Организация = Справочники.Организации.НайтиПоКоду("000000001");
НовДок.ПодразделениеОрганизации = Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000001");
НовДок.НормаДнейЗаМесяц = НормаДнейЗаМесяц;
НовДок.НормаЧасовЗаМесяц = НормаЧасовЗаМесяц;
НовДок.ПредварительныйРасчет = Ложь;

Сообщить("Начата загрузка документа Начисление");
Пока Фл = 1 Цикл

нСотрудник = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,8).Value));

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка КАК Ссылка
|ИЗ
| Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций";

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

Для каждого Стр из РезультатЗапроса Цикл
НоваяСтрока = НовДок.РаботникиОрганизации.Добавить();
НоваяСтрока.Сотрудник = Стр.Ссылка;
КонецЦикла;

НоваяСтрока = НовДок.Начисления.Добавить();
НоваяСтрока.Авторасчет = Истина;
НоваяСтрока.Назначение = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(нСотрудник);
Если СокрЛП(Строка(ExcelЛист.Cells(НомСтр,4).Value)) = "1" Тогда
НоваяСтрока.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоДням
ИначеЕсли СокрЛП(Строка(ExcelЛист.Cells(НомСтр,4).Value)) = "120" Тогда
НоваяСтрока.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Больничный за счет предприятия");
КонецЕсли;
НоваяСтрока.ДатаНачала = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,2).Value));
НоваяСтрока.ДатаОкончания = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,3).Value));
НоваяСтрока.БазовыйПериодНачало = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,2).Value));
НоваяСтрока.БазовыйПериодКонец = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,3).Value));
НоваяСтрока.Результат = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,5).Value));
НоваяСтрока.Размер = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,5).Value));
НоваяСтрока.ОтработаноДней = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,6).Value));
НоваяСтрока.ОтработаноЧасов = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,7).Value));
НоваяСтрока.НормаДнейЗаМесяц = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,6).Value));
НоваяСтрока.НормаЧасовЗаМесяц = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,7).Value));
НоваяСтрока.ОплаченоДнейЧасов = СокрЛП(Строка(ExcelЛист.Cells(НомСтр,6).Value));

НоваяСтрока = НовДок.НДФЛ.Добавить();
НоваяСтрока.НалоговыйПериод = НачалоМесяца(ТекущаяДата());
НоваяСтрока.Авторасчет = Истина;
НоваяСтрока.Сотрудник = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(СокрЛП(Строка(ExcelЛист.Cells(НомСтр,8).Value)));
НоваяСтрока.ДоходНДФЛ = Справочники.ВидыДоходовНДФЛ.Код01;
НоваяСтрока.ВидСтавки = Перечисления.ВидыСтавокНДФЛ.Основная;
НоваяСтрока.УвеличеннаяСтавка = Перечисления.ВидыСтавокНДФЛ.Увеличенная;

НомСтр = НомСтр+1;
Если ПустаяСтрока(ExcelЛист.Cells(НомСтр,1).Value) тогда
Фл = 0;
НовДок.Записать();
НовДок.ПолучитьФорму("ФормаДокумента").Открыть();
Сообщить("Завершена загрузка документа Начисление");
КонецЕсли;

КонецЦикла;
Excel.WorkBooks.Close();
Excel = 0;
КонецПроцедуры

Вложения:

  • Размер файла:
    128,5 КБ
    Просмотров:
    0
Ответ:
чета жесть какая то
ФЛ=1
Пока ФЛ=1 ЦИКЛ
Если ПустаяСтрока(ExcelЛист.Cells(НомСтр,1).Value) тогда
Фл = 0;

Отладчиком пройдите и посмотрите почему фл у вас неравно 0 после ваших 4х строк , может не пустаястрока
я канешн не спец но это воообще адекватно?)
--- Объединение сообщений, 18 май 2017 ---
Наставник подсказывает что есть какаято функция для подсчета количества строк , либо он пользуется ЗначениеЗаполнено()
Вопрос: Заполнение Табличной части документа

Здравствуйте! Заполняю табличную часть документа из справочника Номенклатура. Нужно, чтобы при выборе номенклатуры автоматически выбирались единицы измерения, которые также хранятся в справочнике. Не пойму что я делаю не так(( в 8.1 никаких проблем с такими процедурами не возникало

1C
1
2
3
4
5
&НаКлиенте
Процедура РасшифровкаНоменклатураПриИзменении(Элемент)
СтрокаТабличнойЧасти=Элементы.Расшифровка.ТекущиеДанные;
СтрокаТабличнойЧасти.ЕдИзм=СтрокаТабличнойЧасти.Номенклатура.ЕдиницаИзмерения;
КонецПроцедуры
Ответ: SHIFT_969, Делала так, но забыла обратиться именно к номенклатуре)
Спасибо!!! Все работает))
Вопрос: 1с 8.3 Вывод картинок в табличной части документа

Имеется документ с табличной частью, с реквизитом Номенклатура (тип СправочникСсылка.Номенклатура ). Нужно при изменении Номенклатуры выводить соответствующую картинку из справочника.

Есть одна особенность картинки хранятся в отдельном справочнике ФотоБанк с реквизитом Фото (тип ХранилищеЗначения). На который и ссылается реквизит Изображение справочника Номенклатура.
(Добавление картинки в Справочник было рассмотрено в этой теме: )

Подскажите, пожалуйста, как все же реализовать вывод картинок в табличной части документа.
Ответ: После долгих мучений, картинка выводиться в табличную часть документа, но очень маленькая. А если в конфигураторе поменять высоту колонки, то картинка выводиться в ее реальном размере (но выходит со стороки - см. скрин 2), хотя стоит в свойстве АвтоРазмер. Как это исправить? И какое свойство надо изменить, чтобы картинка была по центру ячейки?
1C
1
2
3
4
5
6
7
8
9
10
11
12
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
    Номенклатура = СтрокаТабличнойЧасти.Номенклатура;   
    СтрокаТабличнойЧасти.АдресФото = ПолучитьСсылкуКартинки(Номенклатура);
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьСсылкуКартинки(Ссылка)
     АдресФото = ПолучитьНавигационнуюСсылку(Ссылка.Изображение,"Фото");
     Возврат АдресФото;
КонецФункции
Вопрос: Заполнение табличной части документа данными из справочника

Добрый день! Очень нужна ваша помощь ! Есть справочник Должности (на каждую должность список спец средств ) есть табличная часть с такими реквизитами Наименование спец средства,колличество,маркировка и т.д .
Есть документ личная карточка в котором тоже есть табличная часть ,как сделать чтобы при заполнении карточки при выборе профессии табличная часть карточки заполнялась автоматически данными из справочника
Ответ: а ну да слова цикл нет вот тут
1C
1
2
3
4
5
6
7
&НаСервере
Процедура ПриИзмененииПрофессииНаСервере()
Для Каждого Текстр из Объект.Профессия.ТвояТабличнаяЧасть ЦИКЛ
    НоваяСтрока = Объект.ТабличнаяЧастьДока.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтр);//Это если имена реквизитов сопадают, если нет то по реквизитам через равенство
КонецЦикла;
КонецПроцедуры
Вопрос: Внешняя обработка заполнения табличных частей

Добрый день уважаемые. Подскажите пож-та, сделал внешнюю обработку заполнения табличных частей, все отлично отрабатывает и заполняет, но после заполнения необходимо произвести пересчет данных на форме. Т.е. надо как то добратся до ЭлементовФормы и прописать им новые значения. Можно это как то осуществить? Что необходимо сделать?
Ответ: () это же форма документа, если я ее сделаю экспортной мне надо все равно получить форму документа, чтобы добратся до нее.
Вопрос: Заполнение табличной части документа через подчиненный справочник

Доброго времени суток, помогите разобраться, у меня есть документ с номенклатурой, есть План видов характеристик в котором указаны свойства для номенклатуры и есть справочник "Значение свойств" который подченен этому плану и в нем указано значение характеристик. Подскажите пожалуйста, как мне сделать что бы когда я выбераю в документ для какой то номенклатуры свойства что бы выводило сразу все значение характеристик по этому свойству
Ответ: GreenkA, У конфигурации (конфигурацию я прикрепил к теме) есть документа "Сборка", который заполняется на основании документа "Спецификация". Документ спецификация делает движения по регистру сведений "РегистрСпецификации", как сделать что бы если в ручную в документ сборка добавляю системный блок, то по нему автоматически выберались детали с регистра и заносились в табличную часть.
Вот я написал запрос, но не пойму в какую процедуру его нужно вставить и немогу проверить правильный ли он так как документ на него вообще не реагирует
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    РегистрСпецификацииСрезПоследних.НоменклатураСистемныйБлок,
        |    РегистрСпецификацииСрезПоследних.Количество,
        |    РегистрСпецификацииСрезПоследних.Свойство,
        |    РегистрСпецификацииСрезПоследних.НоменклатураДетали
        |ИЗ
        |    РегистрСведений.РегистрСпецификации.СрезПоследних КАК РегистрСпецификацииСрезПоследних";
 
 
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если СписокСистемныхБлоков.НоменклатураСобираемыйСистемныйБлок = ВыборкаДетальныеЗаписи.НоменклатураСистемныйБлок Тогда
            
            СписокДеталейНеобходимыхДляСборки.НоменклатураДетали = ВыборкаДетальныеЗаписи.НоменклатураДетали;
            СписокДеталейНеобходимыхДляСборки.СвойстваДетали = ВыборкаДетальныеЗаписи.Свойство;
            СписокДеталейНеобходимыхДляСборки.Количество = ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;
        
    КонецЦикла;