1с посчитать количество строк в табличной части
Сразу оговорюсь, большую часть данного проекта писала не я, мне поручено его только доработать :) собственно, суть вопроса: Есть документ, содержащий в числе прочего табличную часть, некоторые значения из которой выводятся в табличное поле формы. Табличная часть каким-то боком привязана к справочнику, но каким и где, я не разобралась :) По клику кнопки вызывается форма обработки, которая, в свою очередь, использует экспортную процедуру из общего модуля. И вот в этой самой процедуре требуется посчитать количество строк в табличной части. Как это можно сделать? Обращение к документу и через него к табличной части не срабатывает вообще - выводится ошибка, подсчет строк в табличном поле дает 0 :(
кошерно, но не срабатывает :( из модуля формы документа оно не хочет никуда передаваться, а в других модулях или дает 0, или ошибку :(
обращение к документу дает ошибку Количество = ДокВыработка.ТабличнаяЧасть.Количество; <ОбщийМодуль.ОбщийМодуль>: Поле объекта не обнаружено (ТабличнаяЧасть)ОбщийМодуль.ОбщийМодуль>
божечки. Ну вот подумать мозгом! у какого документа мы путаемся определить количество строк? у среднего?
См. . У тебя не ДокументОбъект и не ДокументСсылка, а ДокументМенеджер. Ты смотришь не табличную часть документа, а что-то загадочное.
Знаю, что вопрос тупой, но как мне обратиться к ДокументСсылка? Компилятор выдает ошибку: : Переменная не определена (ДокументСсылка) Очень извиняюсь, я не блондинка, я просто с 1С всего вторую неделю работаю :)ОбщийМодуль.ОбщийМодуль(654,17)>
Процедура ЗаполнениеИзФайла - что должна сделать? В приведенных процедурах нет документа. О каком документе идёт речь?
Кнопка - на форме обработки. Обработка считывает данные из файла, а эта процедура по замыслу должна эти данные вносить в документ. Этот самый документ, точнее, его форма документа, вызывает обработку, а там уже вызывается процедура.
2 вот секундочку. "Этот самый документ, точнее, его форма документа, вызывает обработку" имеется в иду - что вы открыли или создали конкретный документ, у него есть номер, дата, видна табличная часть? Каким кодом дальше вы открываете из документа форму обработки?
//я открываю уже имеющийся документ, его форму документа, щелкаю там на кнопку и //вызываю обработку:
когда я открываю форму документа, на ней есть несколько табл. полей, одно из которых отображает некоторые поля табл. части.
2 Прще всего у вас должно быть так: ДокументСсылка определить как ссылка на документ Выработка в форме обработки "ВВодНаработки"
Если в процедуру передать Объект документ, то можно все посчитать. Приведенный кусок кода работать и не должен, поскольку неправильно используется менеджер документов
То ли руки у меня кривые, то ли мозг :( не получается у меня объект и все тут. Беру ссылку, она берется, данные вроде как есть, но собственно ссылки нет, пишет, что объект не найден. Соответвенно объект я получить тоже не могу :( Просьба тапками и прочим не кидаться, а объяснить, где и что у меня не так. как итог в табло вижу: ДокументСсылка <Объект не найден>(785:ae13001c253fdef511ddfcd730c36c7b) Объект НеопределеноОбъект>
вот описание функции ПолучитьСсылку. Объясни с какого она здесь боку, и зачем ты нам ее постоянно подсовываешь? Параметры: <Уникальный идентификатор>(необязательный) Тип: УникальныйИдентификатор. Уникальный идентификатор, из которого будет формироваться ссылка. Возвращаемое значение: Тип: ДокументСсылка. Описание: Формирует ссылку из значения типа УникальныйИдентификатор. Данный уникальный идентификатор может быть в дальнейшем получен из ссылки методом УникальныйИдентификатор. Примечание: Если параметр не указан или передано значение Неопределено, то будет сформирована новая уникальная ссылка.Уникальный>
Ладно, давайте на пальцах. Перед вами стоит задача - посчитать количество квадратных метров в вашей комнате? Вопрос как вы будете это делать? Тоже нарисуете асбтрактный прямоугольник и умножите ширину на длину?
или все-таки измерите ширину и длину вашей комнаты. Вопрос - каким образом вы перешли от абстрактной комнаты (документ.менеджер) к конкретно вашей комнате (Документ.Объект)?
Живой Ископаемый: еще раз говорю, я новичок в 1С, всего вторую неделю работаю)) поэтому не знаю иногда самых элементарных вещей. Я пытаюсь взять ссылку на документ и по ссылке получить данный конкретный объект
абстрактная комната и ваша комната - э то мегаэлементарная вещь, о которой знают 6-летние дети, и вам намекнули еще вчера. Еще раз - ссылку на какой именно документ вы пытаетесь взять?
2 У вас в базе 1000 документов выработка. Да-да, 1000, представьте себе такую ситуацию. Это ровно в 1000 раз больше чем вы представляли до сих пор. У какого из этой 1000 документов вы пытаетесь посчитать количество строк вашим кодом?
чувствую 1000 это много. ладно, у вас в базе 2 документа Выработка С №1 от 03.01.09 и №2 от 18.01.09 у какого именно документа вы хотите посчитать количество строк?
У вас в доме две комнаты. кухня и спальня. какая именно комната ваша и как вы будете мерять ее площадь?
у второго документа. да нет, дело не том, сколько их, а в том, что я не понимаю, где именно находится различие. Не в чем оно, а где оно хранится ))
я не знаю, к какому документу из этой 1000 мне обращаться и как (( когда был создан последний из них по дате, я тоже не знаю ((
и мы не знаем. но то что вы пытались сделать - это найти количество строк у документа-менеджера. физически не бывает
не-а, так нельзя, прога эта предназначена как раз-таки для автоматизации производства :) она считывает данные из файла, перезаписывает документ, внося туда все изменившиеся данные, и при необходимости должна информировать о том, что некоторые агрегаты пора в ремонт/на осмотр :)
НайтиПоНомеру(<Номер документа>, ) Параметры: <Номер документа>(обязательный) Тип: Число, Строка. Номер искомого документа. Тип передаваемого значения зависит от установки в конфигураторе представления номера документа. (необязательный) Тип: Дата. Дата из интервала, в котором проводится поиск по номеру. Сам интервал определяется как период уникальности номеров документа, в который входит указанная дата. Например, если номера документов уникальны в пределах месяца и задана дата 10 декабря 2001 года, то поиск будет проводиться в интервале с 01 по 31 декабря 2001 года. Параметр используется для документов с периодической нумерацией.Номер>
но если тебе известна дата дока с точностью до секунду, то лучше запросом. однако криво все это. ты лучше сначала опредились, по каким критериям нужно найьти док.
Возможно пользователь сначала открывает документ, потом из формы этого уже вполне определенного, выбранного им документа открывает форму обработки, обпаботка считывает из файла и вносит изменения в это, открытый документ, из которого она была вызвана?
Люди помогите. Возникла такая ситуация есть табличная часть, к ней применили произвольный фильтр(отбор) и мне необходимо программно подсчитать сколько получилось строк. Можно конечно через меню "вывести список" где выгружает всю табличную часть в текстовый документ, но это не устраивает.
(2), (1) могу ошибаться, но ТвояТабЧасть.Количество() всегда возвращает количество всех строк в табличной части не зависимо от фильтров (по крайней мере так было раньше, кажется из-за того, что фильтры применяются не к "табличной части", а к "табличному полю" отражающую табличную часть).
Мне кажется если у нас "ТаблПоле" это "табличное поле" связаное с Табличной частью "ТвояТабЧасть" то посчитать строки можнопри помощи метода ПроверитьСтроку у табличнго поля т.е. так:
Если ошибаюсь - поправте :)
(3) Ягг, ТвояТабЧасть.Количество() эта конструкция да возвращает первоначальное количество строк.. Но у меня усложняется тем, что табличная часть формируется из запроса.. сперва выбирается отбор для запроса, где эти данные заполняют табличную часть и потом уже в табличной части применяют стандартные фильтры (отборы).. и конструкция ТвояТабЧасть.Количество() уже не выводит это количество..
КолСтр = 0;
Для каждого строкаТ из ТвояТабЧасть цикл
КолСтр = КолСтр + ТаблПоле.ПроверитьСтроку(строкаТ)
КонецЦикла;
В этой конструкции, я не до конца понял, что означает здесь "ТаблПоле"?
(7) AleksZet, ТаблПоле - это элемент формы связанный с таблияной частью
ТаблПоле = ЭлементыФормы.ТвояТабЧасть; // скорее всего так она называется
Кстати, я такое далал на обчной форме. Может быть не справедливо для управляемой.
КолСтр = 0;
Для каждого строкаТ из ТвояТабЧасть цикл
КолСтр = КолСтр + ТаблПоле.ПроверитьСтроку(строкаТ )
КонецЦикла;(
Так не будет работать. Нужно сделать так:
эх, я отстал от 1С-ки, всех новшеств сейчас не знаю, но может так?
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных=Новый ОписаниеИсточникаДанных(ЭлементыФормы.Список.Значение);
Сообщить(ПостроительОтчета.Результат.Выбрать().Количество());
способ, конечно не очень (медленный)
(5) cool.vlad4, Да этот метод работает, Но у меня усложняется тем, что табличная часть формируется из запроса.. сперва выбирается отбор для запроса, где эти данные заполняют табличную часть и потом уже в табличной части применяют стандартные фильтры (отборы).
10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей. 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое Посмотреть все результаты поиска похожих
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Для того чтобы найти строки таблицы значений, в 1с 8 используется два метода: Найти и НайтиСтроки. Первый предназначен для поиска одной строки, содержащей указанное значение. Второй для поиска всех строк, соответствующих указанному отбору. Разберем оба метода подробнее.
Метод Найти
Метод таблицы значений Найти, предназначен для поиска строки таблицы, содержащей указанное значение. Если строк содержащих значение будет несколько, будет найдена только первая из них. Эту особенность надо учитывать. Поиск осуществляется только на «равно». Синтаксис метода:
В первый параметр передаем значение, которое необходимо найти. Во втором можно через запятую указываем список колонок, в которых необходимо проводить поиск. Также можно не заполнять второй параметр, тогда поиск будет учитывать значения во всех колонках таблицы. В случае успешного поиска, метод вернет строку таблицы значений. В противном случае будет получено Неопределено.
Рассмотрим простой пример. У нас есть таблица значений с колонками: Номенклатура, Количество, Цена, Сумма. Найдем строку, содержащую значение 2 в колонке Количество или в колонке Цена.
После поиска, обязательно делаем проверку на Неопределено. Иначе, в случае не найденной строки, можно получить ошибку.
При изменении значений в найденной строке, изменяются и значения в самой таблице. Это логично, так как мы работаем непосредственно со строкой таблицы значений.
Метод НайтиСтроки
Метод НайтиСтроки предназначен для поиска всех строк таблицы значений, соответствующих указанному отбору. Синтаксис метода:
Параметры отбора — это структура, где ключ — имя колонки таблицы, а значение — значение, по которому будет осуществляться поиск в данной колонке. Поиск элементов осуществляется только на «равно». Данный метод возвращает массив найденных строк таблицы, либо пустой массив, если по данным условиям ничего не найдено.
Пример 2. Пусть у нас есть Таблица значений содержащаяся в переменной Таблица, у которой есть колонки Наименование и Код.
Как и в предыдущем методе, изменение значений в найденных строках ведет к изменению значений в таблице. Это не так очевидно, и происходит из-за того, что массив найденных строк содержит ссылки на строки исходной таблицы. Это работает и в обратную сторону. То есть, если вы измените значения в таблице, они изменятся и в найденных строках.
Другие способы найти строки таблицы значений
У рассмотренных методов есть свои недостатки. Основной, поиск только на равенство. Если вам необходимо использовать более сложные конструкции отбора строк, то можно обойти таблицу значений циклом, или передать ее в запрос.
Пример 3. Воспользуемся таблицей из самого первого примера. Обработаем строки, цена в которых находится в интервале от 100 до 1000.
Пример 4. Сделаем тоже самое при помощи запроса.
Стоит заметить, что данные найденные запросом никак не связаны с таблицей значений. Это стоит учитывать, если вам необходимо изменять исходные данные.
Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.
Рассмотрим некоторые приемы работы с табличными частями.
Как обойти табличную часть
Для обхода табличной части можно использовать цикл Для каждого
Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить ( Строка . РеквизитТабличнойЧасти ) ;
На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.
Как получить и обойти выделенные строки табличной части
Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.
Для получения перечня выделенных строк используется следующий код:
Для того чтобы обойти выделенные строки используется цикл Для каждого:
ВыделенныеСтроки = ЭлементыФормы . ИмяТабличногоПоля . ВыделенныеСтроки ;
Для каждого Строка из ВыделенныеСтроки Цикл
Как программно выделить строки табличной части (табличного поля) и снять выделение
Чтобы программно снять выделение строк табличного поля:
Чтобы программно выделить все строки табличного поля:
Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы . ИмяТабличногоПоля . ВыделенныеСтроки . Добавить ( ТекущаяСтрока ) ;
КонецЦикла ;
Как очистить табличную часть
Как получить текущую строку табличной части
Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.
Для обычных форм код будет выглядеть так:
Для управляемых форм:
Как добавить новую строку в табличную часть
Добавление новой строки в конец табличной части:
Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):
НоваяСтрока = ТабличнаяЧасть . Вставить ( Индекс )
//Индекс - номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока . Реквизит 1 = "Значение" ;
Как программно заполнить реквизиты строки табличной части
Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.
Создаваемая обработчиком процедура имеет три параметра:
- Элемент — содержит элемент управления ТабличноеПоле.
- НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
- Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.
Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.
Процедура ТабличнаяЧастьПриНачалеРедактирования ( Элемент , НоваяСтрока , Копирование )
//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат ;
КонецЕсли ;
//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент . ТекущиеДанные ; //Получили текущую строку табличной части
ТекСтрока . СчетУчета = ПланыСчетов . Хозрасчетый . НужныйСчетУчета ;
КонецПроцедуры
Работа с табличной частью объектов в 1С : 13 комментариев
Приветствую!
Только начал изучать 1С.
Кое что уже знаю, но мало и опыта практически ноль.
Создал свою конфигурацию, пока только для тестов.
В данной конфигурации есть документ, назовем его «Заявка».
В данной заявке, есть табличная часть, в которой есть реквизит «Стоимость».
Получается, что таких документов много и мне нужно сложить все реквизиты «Стоимость» из всех документов «Заявка».
Вопрос.
Как мне это сделать?
Предполагаю, что нужно использовать функцию с экспортом, в которой будет цикл «Для Каждого ……»
Но как это оформить, пока не могу понять…
Сделать это можно по-разному. Цикл Для каждого, на мой взгляд, не очень подходящий вариант, т.к. будет работать слишком долго. Да и надо еще где-то список документов брать.
Спасибо!
Буду пробовать.
А может это подойдет?
Табличная часть (Tabular section)
Итог (Total)
Синтаксис:
Тип: Число; Строка.
Индекс либо имя колонки, по которой подсчитывается итог.
Возвращаемое значение:
Тип: Число; Неопределено.
Суммирует значения всех строк в указанной колонке.
Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
Сервер, толстый клиент, внешнее соединение.
Пример:
Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.
Добрый день!
Достаточно ли будет обратиться в модуле формы к текущей строке табличной части или в модуле менеджера тоже нужно будет что-то прописать?
Не совсем понял, о чем конкретно вопрос.
Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.
Здравствуйте!
Опишу вкратце ситуацию:
Из документа вызывается команда печати штрихкодов и в обработку печати передается, как я понимаю, весь контекст документа и печатаются этикетки для всех строк документа. Возможно ли в обработке печати получить информацию только о выделенных строках из этого контекста ? Прилагаю код модуля команды ПечатьЭтикеток.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
//Создаём новую коллекцию печатных форм
КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(«ПечатьЭтикеток»);
//Добавляем в коллекцию сформированный табличный документ
КоллекцияПечатныхФорм[0].ТабличныйДокумент = ТабДокумент;
//Устанавливаем параметры печати (при необходимости)
КоллекцияПечатныхФорм[0].Экземпляров = 1;
КоллекцияПечатныхФорм[0].СинонимМакета = «ПечатьЭтикеток»; //Так будет выглядеть имя файла при сохранении в файл из формы «Печать документов»
//Вывод через стандартную процедуру БСП
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, Неопределено, Неопределено);КонецПроцедуры
ТабДокумент.АвтоМасштаб = истина ;
ТабДокумент.ОтображатьСетку = Ложь;
ТабДокумент.ТолькоПросмотр = Истина;
ТабДокумент.ОтображатьЗаголовки = Ложь;
Макет = ДокСсылка.ПолучитьОбъект().ПолучитьМакет(«Этикетка»);
Для каждого Стр Из ДокСсылка.Картриджи Цикл
//Если Лев(Стр.СерийныйНомер,2) «30» Тогда
// Продолжить;
//КонецЕсли;
ОбластьМакета = Макет.ПолучитьОбласть(«ШПК»);
ЧтоТо = Стр.СерийныйНомер;
ПервыйМодуль.ВывестиШтрихкодДокументаВОбластьМакета(ВнешняяКомпонента,ОбластьМакета,ЧтоТо) ;
Информацию о выделенных строках вы можете получить только в модуле формы документа, причем, если мне не изменяет память, это должна быть клиентская процедура. По ссылке на документ выделенные строки получить нельзя.
Значит я на клиенте должен сформировать таблицу выделенных строк и уже ее передавать в обработку печати ?
Да, логика такая. Только учтите, что таблица значений не передается с клиента на сервер.
Выделенный строки табличного поля на форме — это массив строк. Надо попробовать, передастся ли он. Если да, хорошо. Если нет — надо думать, как его передать.
Доброго времени суток!
Создаю обработку на обычных формах, в которой имеется несколько Табличных частей. Они в свою очередь находят отображение в Форме обработки. И если данные первых 3, меня после закрытия Формы, не интересуют, то данные последней хотелось-бы использовать в дальнейшем, пока открыта обработка. В настоящее время при закрытии Формы Табличные части очищаются. В дальнейшем, в новом сеансе работы с обработкой эти данные не нужны. Насколько я понимаю Функции сохранения Данных Табличной части обработки не существует. Табличную часть в обработке решил использовать из-за возможности сохранить структуру Данных. Как мне сохранить эти данные для использования в других окнах?
Может у Вас есть видео по данному вопросу?
Читайте также: