Программно изменить реквизит документа
Автор Ruslan09609, 03 дек 2018, 09:31
0 Пользователей и 2 гостей просматривают эту тему.
Добрый день! Я с помощью запроса получил все документы ОПЗС теперь мне надо в документе ОПЗС табличной части продукция перевыбрать строку номенклатура и провести документ,помогите пожалуйста совсем зеленому программисту.
Какой код должен быть в цикле ?Заранее благодарю за то что вникаете в мою проблему.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ОтчетПроизводстваЗаСмену.Ссылка,
| ОтчетПроизводстваЗаСмену.Дата,
| ОтчетПроизводстваЗаСмену.Продукция.(
| Номенклатура
| )
|ИЗ
| Документ.ОтчетПроизводстваЗаСмену КАК ОтчетПроизводстваЗаСмену»;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОтчетПроизводстваЗаСмену.Записать(РежимЗаписиДокумента.Запись);//не знаю какой код должен быть
КонецЦикла;
Конечная цель какая? «Перевыбрать» — это чтобы выполнились действия при выборе номенклатуры в интерактивном режиме?
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОтчетПроизводстваЗаСмену = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
СтрокаПоиска = ОтчетПроизводстваЗаСмену.Материалы.Найти(НоменклатураДляЗамены, "Номенклатура");
Если СтрокаПоиска <> Неопределено Тогда
СтрокаПоиска.Номенклатура = ЗаменяемаяНоменклатура;
ОтчетПроизводстваЗаСмену.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЦикла;
Ну, вообще то задача самая тривиальная, какая только может быть. Запрос у вас неправильно написан, с избыточной выборкой информации. В нём сейчас выбираются ссылки на все документы + дата каждого документа + для каждого документа, зачем-то, колонка «номенклатура» из табличной части «продукция». Дата, допустим, нужна для упорядочивания, чтоб проводить документы в хронологическом порядке. Но для этого нужно в запросе дописать
"УПОРЯДОЧИТЬ ПО ОтчетПроизводстваЗаСмену.Дата"
Поле «номенклатура» же в запросе Вам не нужно совершенно. Вы будете в цикле получать по каждой ссылке документ-объект. Объект считывается из БД целиком, включая все реквизиты и табличные части.
В общем случае как-то так нужно написать
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); // тут вы получаете объект
Для каждого Стр из ДокументОбъект.Продукция Цикл
Стр.Номенклатура = Номенклатура //ссылка на вашу номенклатуру. Если нужно менять не на одну и ту же, а по какому-то условию, то пишете ваше условие
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); //Вам же провести нужно? Вот и пишите "проведение", а не "запись".
КонецЦикла;
Теги:
- Форум 1С
-
►
Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4 -
►
Конфигурирование, программирование в 1С Предприятие 8 -
►
Программно изменить реквизит документа
Похожие темы (5)
Поиск
Как изменить значение реквизита табличной части? |
Я |
11.06.14 — 09:44
Хэлп…есть справочник, у него есть табличная часть…как изменить значение реквизита этой табличной части? Стандартным механизмом обхода табличной части в цикле, нахождения нужной строки и изменением значения не прокатывает. Сообщить показывает, что значение поменялось, но на форме отображается старое значение…
&НаКлиенте
Процедура ПроектОснованиеПриИзменении(Элемент)
Структура=ИзменитьИсточникФинансирования();
Для каждого строка из Объект.ДополнительныеРеквизиты цикл
Если Найти(строка.Свойство,»Источник финансирования»)=Истина тогда
Сообщить(» ЗашЁЛ!!!»+ строка.Значение+» «+Структура.ИсточникФин+»»);
строка.Значение = Структура.ИсточникФин;
КонецЕсли;
Конеццикла;
КонецПроцедуры
1 — 11.06.14 — 09:45
Записать()
2 — 11.06.14 — 09:46
Не…Когда записываю записывает старое значение…
3 — 11.06.14 — 09:47
Если Найти(строка.Свойство,»Источник финансирования»)=Истина тогда
— это АдЪ
4 — 11.06.14 — 09:47
ИзменитьИсточникФинансирования();
там то что?
5 — 11.06.14 — 09:47
т.е. значение, которое на данный момент отображается
6 — 11.06.14 — 09:48
делай на сервере с ТЧ объекта, а не с элементом формы
7 — 11.06.14 — 09:48
ИзменитьИсточникФинансирования();
там то что?
Там на сервере получаю значения структурой..
8 — 11.06.14 — 09:49
делай на сервере с ТЧ объекта, а не с элементом формы
на сервере тоже самое получается. Но я и тут делаю с табличной частью объекта…Дополнительные реквизиты это тч
9 — 11.06.14 — 09:49
(7) на сервере и меняй
10 — 11.06.14 — 09:51
(7) на сервере и меняй
бесполезно… на форме значение реквизита не меняется
11 — 11.06.14 — 09:53
(10) читай книги, «разработка в управляемом приложении». Это азы…
12 — 11.06.14 — 09:54
&НаСервере
Процедура ИзменитьИсточникФинансирования()
ИсточникФин=»»;
ТекПланТрудозатраты=»»;
Запрос = Новый запрос;
Запрос.Текст=»ВЫБРАТЬ
| ВложенныйЗапрос.Значение,
| Проекты.ТекущийПланТрудозатраты
|ИЗ
| Справочник.Проекты КАК Проекты
| ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ПроектыДополнительныеРеквизиты.Значение КАК Значение,
| ПроектыДополнительныеРеквизиты.Ссылка КАК Ссылка
| ИЗ
| Справочник.Проекты.ДополнительныеРеквизиты КАК ПроектыДополнительныеРеквизиты
| ГДЕ
| ПроектыДополнительныеРеквизиты.Свойство.Наименование = «»Источник финансирования»») КАК ВложенныйЗапрос
| ПО Проекты.Ссылка = ВложенныйЗапрос.Ссылка
|ГДЕ
| Проекты.Ссылка = &Ссылка»;
Запрос.УстановитьПараметр(«Ссылка»,Объект.ПроектОснование);
Выборка=Запрос.Выполнить();
Результат=Выборка.Выбрать();
Если Результат.Следующий() тогда
//Сообщить(» «+Результат.Значение+» «);
//Сообщить(» «+Результат.ТекущийПланТрудозатраты+» «);
Объект.ТекущийПланТрудозатраты=Результат.ТекущийПланТрудозатраты;
ИсточникФин=Результат.Значение;
КонецЕсли;
Для каждого строка из Объект.ДополнительныеРеквизиты цикл
Если строка.Свойство.Наименование = «Источник финансирования» тогда
Сообщить(«»+ строка.Значение+» «+Результат.Значение+»»);
строка.Значение = ИсточникФин;
Сообщить(строка.Значение);
КонецЕсли;
Конеццикла;
ВыборкаОбъект.Записать();
КонецПроцедуры
&НаКлиенте
Процедура ПроектОснованиеПриИзменении(Элемент)
ИзменитьИсточникФинансирования();
//Прочитать();
КонецПроцедуры
Так тоже не работает
13 — 11.06.14 — 09:55
(12) Чё за «ВыборкаОбъект»?
14 — 11.06.14 — 09:58
(12) Чё за «ВыборкаОбъект»?
Упс..это я еще пробывал получитьобъект…там использовалась…сейчас комментарий
15 — 11.06.14 — 10:00
Если Найти(строка.Свойство,»Источник финансирования»)=Истина тогда
— это АдЪ
Эт..да пробывал на клиенте…думал может в этом косяк…
16 — 11.06.14 — 10:01
(14) Так скинь нормальный код, ёлы-палы.
17 — 11.06.14 — 10:20
(14) Так скинь нормальный код, ёлы-палы.
&НаСервере
Процедура ИзменитьИсточникФинансирования()
ИсточникФин=»»;
ТекПланТрудозатраты=»»;
Запрос = Новый запрос;
Запрос.Текст=»ВЫБРАТЬ
| ВложенныйЗапрос.Значение,
| Проекты.ТекущийПланТрудозатраты
|ИЗ
| Справочник.Проекты КАК Проекты
| ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ПроектыДополнительныеРеквизиты.Значение КАК Значение,
| ПроектыДополнительныеРеквизиты.Ссылка КАК Ссылка
| ИЗ
| Справочник.Проекты.ДополнительныеРеквизиты КАК ПроектыДополнительныеРеквизиты
| ГДЕ
| ПроектыДополнительныеРеквизиты.Свойство.Наименование = «»Источник финансирования»») КАК ВложенныйЗапрос
| ПО Проекты.Ссылка = ВложенныйЗапрос.Ссылка
|ГДЕ
| Проекты.Ссылка = &Ссылка»;
Запрос.УстановитьПараметр(«Ссылка»,Объект.ПроектОснование);
Выборка=Запрос.Выполнить();
Результат=Выборка.Выбрать();
Если Результат.Следующий() тогда
Объект.ТекущийПланТрудозатраты=Результат.ТекущийПланТрудозатраты;
ИсточникФин=Результат.Значение;
КонецЕсли;
Для каждого строка из Объект.ДополнительныеРеквизиты цикл
Если строка.Свойство.Наименование = «Источник финансирования» тогда
Сообщить(«»+ строка.Значение+» «+Результат.Значение+»»);
строка.Значение = ИсточникФин;
КонецЕсли;
Конеццикла;
КонецПроцедуры
&НаКлиенте
Процедура ПроектОснованиеПриИзменении(Элемент)
ИзменитьИсточникФинансирования();
КонецПроцедуры
18 — 11.06.14 — 10:33
Профи ну вы хде?))) Хелп плиз…
19 — 11.06.14 — 10:55
апп
20 — 11.06.14 — 10:58
А на форме дополнительные реквизиты как отображаются? Табличная чать показана?
21 — 11.06.14 — 11:02
А на форме дополнительные реквизиты как отображаются? Табличная чать показана?
Да показана…
22 — 11.06.14 — 11:06
Тип(Объект) в отладчике в студию
23 — 11.06.14 — 11:10
(21) Зайди в отладчик, поставь точку останова на строку:
Для каждого строка из Объект.ДополнительныеРеквизиты цикл
и посмотри что есть в твоей «строка» сразу станет понятно что пытаешься сравнить и как нечто входящее в «строка» можно заполнять. Для интереса проделай сие НаКлиенте и НаСервере — прочувствуй разницу.
P.S. Последуй совету из (11).
24 — 11.06.14 — 11:12
25 — 11.06.14 — 11:16
(21) Зайди в отладчик, поставь точку останова на строку:
Для каждого строка из Объект.ДополнительныеРеквизиты цикл
и посмотри что есть в твоей «строка» сразу станет понятно что пытаешься сравнить и как нечто входящее в «строка» можно заполнять. Для интереса проделай сие НаКлиенте и НаСервере — прочувствуй разницу.
P.S. Последуй совету из (11).
В строке все выходит что нужно…но не меняется на форме…
пишу Сообщить(«»+ строка.Значение+» «+Результат.Значение+»»);
строка.значение меняется, а на форме нет…
26 — 11.06.14 — 11:16
(21) а где РеквизитФормыВЗначение() ??Детский сад.
27 — 11.06.14 — 11:18
(21) а где РеквизитФормыВЗначение() ??Детский сад.
оп…а это куда надо?
28 — 11.06.14 — 11:18
(21)
ОбъектНаСервере = РеквизитФормыВЗначение(«Объект»);
Для каждого строка из ОбъектНаСервере.ДополнительныеРеквизиты цикл
Если строка.Свойство.Наименование = «Источник финансирования» тогда
Сообщить(«»+ строка.Значение+» «+Результат.Значение+»»);
строка.Значение = ИсточникФин;
КонецЕсли;
Конеццикла;
ЗначениеВРеквизитФормы(ОбъектНаСервере, «Объект»);
29 — 11.06.14 — 11:19
Блин походу я туплю… прошу понять и простить))))
30 — 11.06.14 — 11:25
(28) Ничего не поменялось все тоже самое…
Оч странно строка значение поменялось а на форме без изменений
31 — 11.06.14 — 11:27
(30) А записываешь где?
32 — 11.06.14 — 11:32
(31) при записи значение пишется не то которое в строка.значение а то которое на форме…
33 — 11.06.14 — 12:18
(31)
34 — 11.06.14 — 13:05
(33)
35 — 11.06.14 — 14:22
Задачка видимо оч сложная…
36 — 11.06.14 — 14:26
Так попкорн у всех с утра закончился, все ушли за новым ведром
37 — 11.06.14 — 14:29
(36) Ну тады другое дело))))))
38 — 11.06.14 — 14:32
(35)Шутник блин.
Есть открытая форма элемента справочника, у него есть ТЧ ДополнительныеРеквизиты (например А, Б и ИсточникФинансирования)
&НаСервере
Процедура ЗаполнитьТЧ(Источник)
Для каждого стр из Объект.ДополнительныеРеквизиты цикл
Если стр.А=1 тогда
стр.ИсточникФинансирования=Источник;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Тебе уже сказали читай книги!
39 — 11.06.14 — 14:35
(38)+ и не используй в названии переменных и ТЧ зарезервированные конструкции, потом сам моск вывихнеш пытаясь понять почему процедура что-то делает не так.
40 — 11.06.14 — 14:46
(38) ДА НЕ РАБОТАЕТ ТАК!!!! НЕ ИЗМЕНЯЮТСЯ ДАННЫЕ НА ФОРМЕ!!!!
41 — 11.06.14 — 14:56
(40) ТЧ назови нормально, например, ДопДанные
100% работает и изменяется, проверено не один раз
Смотри отладчиком на стр — должен быть открывающийся список с реквизитами А, Б и ИсточникФинансирования.
Ты точно работаешь с управляемой формой?
42 — 11.06.14 — 14:58
(40) точку останова на конеццикла и ответь на (22)
43 — 11.06.14 — 15:08
(41) Вот и мной было проверено не один раз…работало…
Только здесь по другому… строка.значение меняется…сообщить это показывает… а на форме результата 0.
44 — 11.06.14 — 15:14
(42)
Объект ДанныеФормыСтруктура ДанныеФормыСтруктура
АвтоматическиРассчитыватьПланПроекта Истина Булево
ВерсияДанных «AAAAAAFgcFs=» Строка
ВидПроекта Общий СправочникСсылка.ВидыПроектов
ГрафикРаботы СправочникСсылка.ГрафикиРаботы
ГрифДоступа СправочникСсылка.ГрифыДоступа
ДатаПоследнейЗагрузкиИзВнешнегоФайла 01.01.0001 0:00:00 Дата
ДополнительныеРеквизиты ДанныеФормыКоллекция ДанныеФормыКоллекция
ЕдиницаДлительностиЗадач час ПеречислениеСсылка.ЕдиницыДлительности
ЕдиницаТрудозатратЗадач чел-час ПеречислениеСсылка.ЕдиницыТрудозатрат
ЗагруженИзMSProject Ложь Булево
ЗадачаОснование СправочникСсылка.ПроектныеЗадачи
Заказчик Федеральное космическое агентство (Роскосмос) СправочникСсылка.Корреспонденты
ЗапретитьАвтоматическоеДобавлениеУчастниковРабочейГруппы Ложь Булево
ИмяПредопределенныхДанных «» Строка
Код «00000000221» Строка
Комментарий » » Строка
Наименование «ОКР «Элинвар»» Строка
Описание «»»г/к от 17.04.2014 №783-К694/13/146
ОКР «»Разработка технологии создания унифицированных интегральных модулей датчиков механических величин, в том числе работоспособных в экстремальных условиях эксплуатации с применением технологии ультрапрецизионной мехобработки и прецизионной электроэрозионной обработки труднообрабатываемых инварных и элинварных сплавов на ультрапрецизионных станках с числовым программным управлением, технологии нанообразивного шлифования и полирования прецизионных деталей чувствительных элементов датчиков, с использованием технологии лазерной размерной обработки и модифицирования поверхности»», (шифр ОКР «»Элинвар»»)»»» Строка
Организация СправочникСсылка.Организации
ПометкаУдаления Ложь Булево
Предопределенный Ложь Булево
ПроектОснование 1тестирование СправочникСсылка.Проекты
ПроектнаяКоманда ДанныеФормыКоллекция ДанныеФормыКоллекция
РедактируетсяВСтороннейСистеме Ложь Булево
Родитель 1ОКР тест СправочникСсылка.Проекты
Руководитель ннова Налья Владимировна (Ведущий инженер-программист) СправочникСсылка.Пользователи
Состояние Инициирован ПеречислениеСсылка.СостоянияПроектов
СписыватьЗатратыНаПроект Истина Булево
СпособПланирования От даты начала проекта ПеречислениеСсылка.СпособыПланированияПроекта
Ссылка ОКР «Элинвар» СправочникСсылка.Проекты
СсылкаНаВнешнийФайл «» Строка
ТекущийПланНачало 01.01.2014 0:00:00 Дата
ТекущийПланОкончание 31.12.2014 0:00:59 Дата
ТекущийПланТрудозатраты 555 Число
УдалитьАвтоматическиВестиРабочуюГруппу Ложь Булево
Утвержден Истина Булево
ЭтоГруппа Ложь Булево
45 — 11.06.14 — 15:14
типа это?
Timon1405
46 — 11.06.14 — 15:21
(44) зрителям с попкорном достаточно первой строчки
Казалось бы, простая задача – изменить данные в определённой строке табличной части документа или справочника.
Получаем объект, табличную часть которого надо изменить. Используем метод ПолучитьОбъект().
Итак, у нас есть табличная часть и есть метод Найти(), который возвращает строку табличной части. Однако при попытке присвоить полю найденной строки какого-либо значения, система выдаёт ошибку.
Выход: изменять строки табличной части в цикле.
Допустим, табличная часть называется «Товары». Она имеет две колонки: «Номенклатура» и «Артикул».
Обходим строки табличной части в цикле и изменяем то, что нам нужно.
Для Каждого СтрокаТабличнойЧасти Из Товары Цикл Если СтрокаТабличнойЧасти.Артикул = "0001" Тогда СтрокаТабличнойЧасти.Артикул = "0123"; КонецЕсли; КонецЦикла;
- Информация о материале
- Категория: Программирование 1С
-
Опубликовано: 20 апреля 2016
Сегодня хочу рассказать о том как можно изменить табличную часть документа в 1С. Когда у меня не было опыта в программирования, и передо мной стояла подобная задача. Я обратился за помощью к интернету и очень сильно удивился, когда не нашел ответа на свой вопрос. В принципе было очень мало сайтов, на которых бы люди что-то рассказывали и объясняли. В основном это форумы, на которых новичку найти ответ очень сложно. Так как все отвечают очень кратко и в общих чертах. Остальная часть сайтов предлагала пройти курсы. Сегодня, хочу вам рассказать об одном способе, с помощью которого можно изменить табличную част документа.
А если быть точней то изменить дату у записей в табличной части, но по аналогии можно изменить все что угодно.
Как изменить дату в ТЧ у всех записей
И так допустим у на есть какой-то документ, у него есть табличная часть, в которой нужно что-то изменить, например, установить одну и туже дату, которую пользователь сам укажет.
Для этого нужно открываем конфиггуратор, найти документ, создать в нем команду «Изменить дату», открыть свойства данного элемента и перейти а Действие.
В открывшемся модуле пишем следующий код.
&НаКлиенте
Процедура ИзменитьДату(Команда)
УстановкаДаты = "";
Результат = ВвестиДату(УстановкаДаты, "Введите дату", ЧастиДаты.Дата);
Для Каждого ДанныеСтроки Из Объект.Работы Цикл
ДанныеСтроки.Дата = УстановкаДаты;
КонецЦикла;
КонецПроцедуры
УстановкаДаты = «»; — задаем пустое значение для переменной в которой будет храниться дата.
Результат = ВвестиДату(УстановкаДаты, «Введите дату», ЧастиДаты.Дата); — открываем форму ввода даты и сохраняем её в переменную УстановкаДаты.
И в цикле перебираем строки и записываем дату.
Сохраняем и запускаем программу. Открываем документ в который вносили изменения, теперь на форме появилась кнопка «Изменить дату», которая открывает окно в котором можно выбрать дату.
После выполнения данной команды, выбранная дата установиться для всех записей табличной части документа.
Если немного подправить данный код можно поменять любое значение в табличной части документа.
Если возникли трудности то пишите в комментариях обязательно помогу.
В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 1С 8.3. В этой статье мы изучим некоторые вопросы программной работы с табличными частями 1С.
Заполнение табличной части 1С 8.3
Очень часто встречается задача заполнить табличную часть какими-нибудь значениями, например результатом выполнения запроса. Для демонстрации реализуем пример, в котором выполняется заполнение табличной части. Сделаем небольшую учебную задачу: будем заполнять табличную часть документа всей номенклатурой, которая не помечена на удаление. Количество при этом будет равно 1. Для заполнения табличной части документа нам необходимо работать с одноименной таблицей реквизита Объект, который является основным реквизитом управляемой формы.
Поскольку по условиям задачи, необходимо отобрать всю не помеченную на удаление номенклатуру, то оптимально это сделать при помощи запроса, в котором я буду получать все не помеченные элементы справочника номенклатура. Я создал команду, при выполнении которой будет заполняться табличная часть, и разместил её на форме.
Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.
&НаСервере Процедура ЗаполнитьТоварамиНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Ссылка КАК Товар, | 1 КАК Количество |ИЗ | Справочник.Товары КАК Товары |ГДЕ | НЕ Товары.ПометкаУдаления"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл НовСтр = Объект.СписокТоваров.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ЗаполнитьТоварами(Команда) ЗаполнитьТоварамиНаСервере(); КонецПроцедуры
При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.
Обратите внимание, поскольку при обходе запроса и заполнения новой строки, я использую метод ЗаполнитьЗначенияСвойств, то поля в запросе должны называться так же, как и поля табличной части.
Очистка табличной части документа 1С 8.3
Если мы реализуем данный код, то он будет не совсем корректен: каждый раз при выполнении этого кода будут добавляться новые строки, а вполне возможно, что пользователю старые строки не нужны. Поэтому, будем очищать имеющиеся строки, перед добавлением новых строк. Для этого воспользуемся методом Очистить объекта СписокТоваров, который имеет тип ДанныйФормыКоллекция.
Объект.СписокТоваров.Очистить();
После выполнения этого метода вся табличная часть будет очищена.
Текущая строка табличной части 1С 8.3
В процессе работы может возникнуть необходимость отработать текущую строку табличной части, т.е. ту строку, которая в данный момент выделена.
Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.
Для решения данной задачи нужно воспользоваться свойством ТекущиеДанные элемента с типом ТаблицаФормы, который соответствует нужной табличной части. Свойство ТекущиеДанные возвращает значение полей текущей строки.
Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.
В этом обработчике напишем код, который будет пересчитывать значения полей текущей строки табличной части.
&НаКлиенте Процедура СписокТоваровЦенаПриИзменении(Элемент) ТекДанные = Элементы.СписокТоваров.ТекущиеДанные; Если ТекДанные = Неопределено Тогда Возврат; //если пустая таблица КонецЕсли; ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена; КонецПроцедуры
Ещё пример: я создал команду, которая должна увеличивать количество в текущий строке табличной части в два раза и пересчитывать сумму. Эта команда размещена в командной панели таблицы и имеет следующий код:
&НаКлиенте Процедура УмножитьНа2(Команда) ТекДанные = Элементы.СписокТоваров.ТекущиеДанные; Если ТекДанные = Неопределено Тогда Возврат; //если пустая таблица КонецЕсли; ТекДанные.Количество = ТекДанные.Количество * 2; ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена; КонецПроцедуры
Теперь доработаем этот пример: после увеличения текущей строки будем сдвигать текущую строку на строку вниз. Для этого допишем предыдущий код:
Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока; ИдентификторСлед = Идентификтор + 1; Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед; КонецЕсли;
В этом коде мы получаем идентификатор текущий строки при помощи свойства таблицы управляемой формы ТекущаяСтрока, и если мы не выходим за приделы таблицы, то сдвигаем нашу текущую строку на один шаг вниз.
Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.
&НаКлиенте Процедура СписокТоваровКоличествоПриИзменении(Элемент) Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока; Если Идентификтор = Неопределено Тогда Возврат; КонецЕсли; ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор); Если ТекСтрока = Неопределено Тогда Возврат; КонецЕсли; ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество; КонецПроцедуры
В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.
Обход табличной части 1С
Часто возникают задачи обойти табличную часть и изменить какие-либо значения в столбцах. В предыдущих примерах мы изменяли текущую стоку таблицы, теперь реализуем пример, когда нужно изменить все строки. В этом случае нет необходимости обращаться к элементам формы, можно работать напрямую с основным реквизитом Объект.
&НаКлиенте Процедура УмножитьВсеНа2(Команда) ТабОбх = Объект.СписокТоваров; Для Каждого стрТабл из ТабОбх Цикл стрТабл.Количество = стрТабл.Количество * 2; стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество; КонецЦикла; КонецПроцедуры
Остальные статьи по теме конфигурирования в 1С:
Конфигурирование табличный частей объектов 1С
Справочники в 1С 8.3
Документы в 1С 8.3
Предопределенные элементы справочников 1С
Формы справочников в 1С 8.3
Более подробно и основательно конфигурирование в 1С дается в моей книге:
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Unison1 0 / 0 / 1 Регистрация: 02.11.2016 Сообщений: 62 |
||||
1 |
||||
1C 8.x Программно изменить реквизит документа внешней обработкой10.05.2017, 11:24. Показов 36772. Ответов 13 Метки нет (Все метки)
Есть код внешней обработки, но он ничего не меняет:
Что я делаю неправильно?
0 |
1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,394 |
|
10.05.2017, 11:51 |
2 |
Какой тип значения у ДокОбъект.Куратор? Скорей всего что-то типа СправочникСсылка.Сотрудники.
0 |
OrkVasya о_____О 224 / 223 / 37 Регистрация: 19.11.2010 Сообщений: 1,062 |
||||
10.05.2017, 12:04 |
3 |
|||
Unison1, давно у нас ДокументОбъект превратился в выборку?
0 |
0 / 0 / 1 Регистрация: 02.11.2016 Сообщений: 62 |
|
10.05.2017, 12:07 [ТС] |
4 |
ДокОбъект.Куратор — тип СправочникСсылка.Пользователи.
0 |
OrkVasya о_____О 224 / 223 / 37 Регистрация: 19.11.2010 Сообщений: 1,062 |
||||
10.05.2017, 12:09 |
5 |
|||
Unison1, либо какая-то дикая конфа, либо не согласен.
0 |
0 / 0 / 1 Регистрация: 02.11.2016 Сообщений: 62 |
|
10.05.2017, 12:11 [ТС] |
6 |
OrkVasya, Всё-равно не работает)
0 |
polax 1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,394 |
||||
10.05.2017, 12:12 |
7 |
|||
ДокОбъект.Куратор — тип СправочникСсылка.Пользователи. Не правы. ДокОбъект.Клиент.ОтветственныйМенеджер — это СправочникСсылка.Пользователи. а с .Наименование — 100% строка
Все заработает
0 |
о_____О 224 / 223 / 37 Регистрация: 19.11.2010 Сообщений: 1,062 |
|
10.05.2017, 12:13 |
8 |
Unison1, что не работает-то? В чем нерабочесть заключается?
0 |
Unison1 0 / 0 / 1 Регистрация: 02.11.2016 Сообщений: 62 |
||||
10.05.2017, 12:17 [ТС] |
9 |
|||
polax, Вы правы ОтветственныйМенеджер.Наименование — строка.
Поле Куратор всё-равно пустое. Может я документ неправильно получаю? Добавлено через 43 секунды
0 |
о_____О 224 / 223 / 37 Регистрация: 19.11.2010 Сообщений: 1,062 |
|
10.05.2017, 12:19 |
10 |
Unison1, поставь точку останова на строку «ДокОбъект.Записать()» и медетируй на реквизиты и их типы.
0 |
1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,394 |
|
10.05.2017, 12:23 |
11 |
Unison1, А что отладчик говорит для ДокОбъект.Клиент.ОтветственныйМенеджер? Похоже, значение не заполнено Добавлено через 1 минуту
0 |
0 / 0 / 1 Регистрация: 02.11.2016 Сообщений: 62 |
|
10.05.2017, 12:29 [ТС] |
12 |
OrkVasya, Если бы я мог отладить я бы сюда не писал. Добавлено через 1 минуту
0 |
о_____О 224 / 223 / 37 Регистрация: 19.11.2010 Сообщений: 1,062 |
|
10.05.2017, 12:57 |
13 |
Unison1, мы тоже отладить не можем за тебя. Добавлено через 2 минуты
0 |
Unison1 0 / 0 / 1 Регистрация: 02.11.2016 Сообщений: 62 |
||||
10.05.2017, 13:15 [ТС] |
14 |
|||
Сообщение было отмечено GreenkA как решение РешениеВсё проще чем я думал)
Добавлено через 5 минут
0 |
Как программно через внешнюю обработку у документов отчет о розничных продажах за определ период изменить реквизит в табличной части?
«Как программно …» — программно!
Зачем изобретать велосипед, если есть нужные обработки на ИТС?
-Выбрать документы за определенный период. -Перебрать полученные документы, изменяя по определенному условию реквизит табличной части и после записывая документ.
я когда изменяю реквизит счет доходов через обработку на ИТС то субконто автоматически
не изменяется в документе отчет о розничных продажах в бухгалтерии
Изменить счет, потом изменить субконто, потом перепровести доки… или писать свою обработку…
а субконто разное в зависимости группы номенклатуры
если операция разовая, то можно помучаться с отборами… Если постояно, то пиши обработку…
операция не разовая видно придется писать обработку
в вполне популярно ответили
ну как изменить реквизит в документе через програмный код ?
Тэги:
Комментарии доступны только авторизированным пользователям