Не сворачивается таблица значений 1с 8

Обновлено: 05.07.2024

Вообщем создал документ Таблица. В него заношу данные. Сколько продукции произвели, сколько отгрузили, сколько осталось.
Документ делаю каждый день на основании предыдущего. Соответственно остатки на конец прошлого дня равны остаткам на начало текущего.
На случай если в прошлом дне что-то накосячили решил сделать кнопку обновления остатка на начало дня.(Коробки = ДокументОснование.ОстатокКор).
Соответственно нужно чтобы все графы которые в течении дня заносилиь данными сохранились, а начальный остаток в случаи изменений в документе-основания поменялся. Сделал, а таблица не сворачивается как надо. Продукция попадает в табличную часть 2 раза. Первый раз со значением произвели столько то, а второй раз с начальным остатком. Что у меня не так? Уже как только не сворачивал((

Если (ДокументОснование.Выбран() = 0) Тогда
Предупреждение("Укажите документ основание.", 60);
Возврат;
КонецЕсли;
Если ДокументОснование.Вид() = "Таблица" Тогда // план тут.
МестоХранения = ДокументОснование.МестоХранения;
ДокументОснование.ВыбратьСтроки();
Пока ДокументОснование.ПолучитьСтроку() = 1 Цикл

ТабОстатков.НоваяСтрока();
ТабОстатков.МПЗ = ДокументОснование.Продукция;
ТабОстатков.КоличествоКнижное = ДокументОснование.ОстатокКор;
ТабОстатков.ВидМПЗ = ДокументОснование.ВидМПЗ;
КонецЦикла;

Процедура ЗаполнитьТаб()
Таб1 = СоздатьОбъект("ТаблицаЗначений");
Если ТабОстатков.КоличествоСтрок() = 0 Тогда
СформироватьТаблицуОстатков();
КонецЕсли;

Если КоличествоСтрок() = 0 Тогда
ТабОстатков.ВыбратьСтроки();
Пока ТабОстатков.ПолучитьСтроку() = 1 Цикл
НоваяСтрока();
Продукция = ТабОстатков.МПЗ;
ВидМПЗ = ТабОстатков.ВидМПЗ;
ЕдиницаИзмерения = Продукция.ЕдиницаИзмерения;
Коробки = ТабОстатков.КоличествоКнижное;
КонецЦикла;
Иначе
ВыгрузитьТабличнуюЧасть(Таб1,"Продукция,Произвели,Коробки,ВидМПЗ");
Таб1.НоваяКолонка("КоличествоКнижное","Число",10,3);

ТабОстатков.ВыбратьСтроки();
Пока ТабОстатков.ПолучитьСтроку() = 1 Цикл
Таб1.НоваяСтрока();
Таб1.Продукция = ТабОстатков.МПЗ;
Таб1.КоличествоКнижное = ТабОстатков.КоличествоКнижное;
Таб1.ВидМПЗ = ТабОстатков.ВидМПЗ;
КонецЦикла;

// Таб1.Свернуть("МПЗ","Коробки,Количество,КоличествоКнижное,Произвели,ВидМПЗ,");
Таб1.Свернуть("МПЗ","КоличествоКнижное,Коробки,ВидМПЗ,Произвели");
УдалитьСтроки();

Таб1.ВыбратьСтроки();
Пока Таб1.ПолучитьСтроку() = 1 Цикл
Если (Таб1.КоличествоКнижное = 0) и (Таб1.Произвели=0) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока();
ВидМПЗ = Таб1.ВидМПЗ;
Продукция = Таб1.Продукция;
ЕдиницаИзмерения = Продукция.ЕдиницаИзмерения;
Коробки = Таб1.КоличествоКнижное;
Произвели = Таб1.Произвели;
КонецЦикла;
КонецЕсли;
Таб1 = 0;
КонецПроцедуры //
//***************


Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.

Таблица значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками таблицы, добавляя и удаляя их, но и колонками.

Создание таблицы значений

Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый :

Колонки таблицы значений

Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:

Доступ к колонкам производится через свойство Колонки объекта ТаблицаЗначений . Для добавления новой колонки используется метод Добавить():

Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():

Перебор колонок выполняется следующим образом:

Для удаления колонки используется метод Удалить():

Свойства колонки таблицы значений

Имя Тип Описание
Имя Строка символьный идентификатор колонки, по которому к ней можно обращаться из кода
Заголовок Строка строковое представление колонки на форме
ТипЗначения ОписаниеТипов свойство органичивает пространство доступных значений, которые можно указать в данной колонке
Ширина Число ширина колонки на форме (выражается в количестве символов)

Методы коллекции колонок таблицы значений

Вставить() Вставляет новую колонку в указанную позицию коллекции
Добавить() Добавляет новую колонку в конец коллекции
Количество() Возвращает количество колонок в коллекции
Найти() Ищет колонку в коллекции по имени
Очистить() Удаляет все колонки из коллекции
Сдвинуть() Сдвигает колонку влево или вправо
Удалить() Удаляет колонку из коллекции

Строки таблицы значений

С колонками разобрались. Давайте теперь разберемся со строками. Строки таблицы значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.

Добавление и удаление строк

Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений . Метод возвращает объект СтрокаТаблицыЗначений , с которым доступны дальнейшие манипуляции:

И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:

Обратите внимание, что каждая СтрокаТаблицыЗначений ссылается на таблицу значений с помощью метода Владелец():

Для удаления строки используется метод Удалить() объекта ТаблицаЗначений . Строку можно удалить либо передав методу непосредственно строку, либо ее индекс:

Перебор строк таблицы значений

Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :

Поиск строк

Все методы таблицы значений:

Вставить() Вставляет строку на указанное место
ВыбратьСтроку() Позволяет интерактивно выбрать строку в диалоговом окне
ВыгрузитьКолонку() Выгружает значения ячеек указанной колонки в массив значений
Добавить() Добавлет новую строку в таблицу значений
ЗагрузитьКолонку() Загружает значения в ячейки указанной колонки из массива
ЗаполнитьЗначения() Заполняет ячейки указанных колонок определенным значением
Индекс() Возвращает индекс строки таблицы значений
Итог() Возвращает просуммированный итог по колонке таблицы значений
Количество() Возвращает количество строк в таблице значений
Найти() Выполняет поиск строки по значению
НайтиСтроки() Выполняет поиск строк по указанным параметрам
Очистить() Очищает строки таблицы значений
Получить() Возвращает строку по ее индексу
Свернуть() Выполняет сжатие строк и колонок таблицы значений
Сдвинуть() Сдвигает строку вверх или вниз по таблице
Скопировать() Создает новую таблицу значений копированием текущей
СкопироватьКолонки() Создает новую пустую таблицу значений путем копирования колонок текущей таблицы
Сортировать() Выполняет сортировку строк таблицы значений по указанным колонкам
Удалить() Удаляет строку таблицы значений

Иерархию свойств и типов значений, связанных с таблицей значений, схематически можно представить в виде дерева:

Рассмотрим два способа в 1с свернуть таблицу значений. Для первого воспользуемся методом таблицы значений Свернуть, для второго используем Запрос.

Свернуть с использованием метода таблицы значений

У таблицы значений существует специальный метод Свернуть. Он позволяет группировать строки по полям, указанным в первом параметре и суммировать значения полей, указанных во втором параметре.

Пример 1. Пусть у нас существует таблица значений с колонками Номенклатура, Цена, Количество, Сумма. Необходимо в 1с свернуть таблицу значений по колонкам Номенклатура и Цена, просуммировав при этом данные в колонках Количество и Сумма.

1с свернуть таблицу значений

Также стоит отметить следующие особенности метода Свернуть:

  • Работает только НаСервере (как и любые действия с таблицами значений);
  • Прост в реализации;
  • Может суммировать значения, но не может получать минимум, максимум, среднее и т.д.

Свернуть таблицу значений при помощи запроса

Если для вашей задачи недостаточно метода Свернуть, то можно воспользоваться возможностями языка запросов, для свертки таблицы значений. Например, вам необходимо получить среднее или максимум, по значениям колонки.

Для свертки таблицы значений запросом необходимо:

  • Таблицу значений передать параметром в запрос;
  • Сгруппировать по нужным полям,
  • Применить агрегатные функции к нужным полям (сумма, максимум, минимум, среднее);
  • Выгрузить результат запроса в таблицу значений.

Пример 2. Пусть у нас существует таблица значений с колонками Номенклатура, Цена, Количество, Сумма. Необходимо в 1с свернуть таблицу значений по колонке Номенклатура, по колонке Цена получить среднее значение, просуммировать данные в колонках Количество и Сумма.

Вся информация, представленная в статье, относится только к управляемому приложению.

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

Текущие данные 1С

  • Доступно только на клиенте. Его нельзя передавать и использовать на сервере. Поэтому правильно будет получить значения нужных полей в клиентской процедуре и передать их в серверную, при необходимости.
  • Содержит данные реквизитов добавленных на форму, а также данные реквизитов с установленным флагом Использовать всегда. Остальные реквизиты отсутствуют в коллекции.

    Как видно на картинке, в текущих данных представлены реквизиты Номенклатура и Сумма, добавленные в таблицу и реквизит Количество с установленным флагом Использовать всегда.
  • В случае, если таблица формы пустая или у нее нет активизированной строки, свойство ТекущиеДанные будет содержать значение Неопределено. Поэтому, перед использованием свойства, имеет смысл делать проверку. Но только в тех случаях, когда таблица действительно может быть пустой или не активизированной. Например событие ПриАктивизацииСтроки вызывается и для пустой таблицы. А вот событие ПриИзменении колонки таблицы, может вызываться только при наличии активизированной строки. Поэтому в проверке не будет смысла.

Варианты получения свойства Текущие данные 1С

В общем случае к свойству ТекущиеДанные можно обратиться через элемент формы к которому оно относится.

Но при обращении к текущим данным из обработчика события таблицы формы, можно воспользоваться параметром Элемент. В нем уже содержится таблица формы. В этом случае обращение к текущим данным будет выглядеть следующим образом:

Такое обращение к текущим данным не получится реализовать в обработчиках событий колонок таблицы формы. Так как в параметр Элемент там передается ПолеФормы, относящееся к колонке.

Читайте также: