Здравствуйте, уважаемые!
Вашему взору представлена рассылка "1С: грабли, камни и бриллианты" и
я ее ведущий Кружаев Валерий krug@tula.net
Выпуск 13.
Пришло очень много писем с вопросами и предложениями по работе с таблицами значений.
Поэтому сегодня весь выпуск будет посвящен этому.
_________________________________________________________
К сожалению таблица значений не позволяет вводить в нее данные напрямую. В качестве
альтернативы предлагаю следующий вариант (так сделано, например, в документе
"СчетФактура" типовой конфигурации). При открытии формы сделать две закладки,
которые будут использовать один и тот же слой с табличной частью.
В процедуре ПриВыбореЗакладки() делать видимыми/невидимыми соотв. колонки (Форма.Колонка.Видимость(0/1))
Соответственно в табличную часть документа нужно будет добавить все необходиме
реквизиты которые нужны для заполнения в первой и во второй таблице.
-------------------------------------
Вводить данные в таблицу значений можно, если поместить под нее процедуру и в
ней смотреть какую строку или колонку тыкнул пользователь.
У меня эта процедура обычно называется ПриИнициализации(), и в ней происходит
следующее:
Процедура ПриИнициализации()
Если Таб.ТекущаяКолонка() = "Колич" Тогда
Числ = Таб.Колич;
Если ВвестиЧисло(Числ,"Введите отпускаемое количество:",10,3) = 1 Тогда
Таб.Колич = Числ;
КонецЕсли;
КонецЕсли;
КонецПроцедуры;
Аналогично делаем манипуляции с данными в колонках с другими типами данных, используя
типовые для них средства ввода.
Коряво и много текста, но иногда по-другому не решается. Ниже напишу почему.
По той же причине не подходит разбивать одну таблицу на две закладки.
__________________________________________________________
ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр()
---------------------------------------
Не все так просто. А как в таком случае корректировать значения в этой таблице
значений?
Ситуация практическая такая:
мне нужен документ, в котором бы одновременно было и списание и приход,
т.е. акт прихода и акт списания в одном флаконе.
Смысл операции такой: например, наше подразделение РСУ произвело 3 полочки и
2 стенда для
собственных нужд , потратив при этом 1 м3 досок, 1 литр лака и 0.5 кг гвоздей.
Мне нужно списать все израсходованное (доски, лак и гвозди), просчитать сумму,
на которую списано материалов и оприходовать на эту сумму 3 полки и 2 стенда,
причем в другие разные подразделения. С моей точки зрения, удобно было бы иметь
перед глазами две таблички:
в левую я бы написала:
ном.№ Наименование Количество Ед. изм. Счет Затрат Субконто1
Субконто2 Субконто3
14325 Доска 40 мм 1 м3 23.0 20. собств.
нужды подр. РСУ вид услуг
,,,,,,,
а в правую:
ном.№ Наименование Количество Ед. изм. Счет Субконто1
Субконто2 Субконто3
15895 Полка 3 шт 10.1 ------
-------- --------
....
А при проведении посчитала бы сумму, на которую списывается материалов в левой
табличке и оприходовала бы на эту же сумму изготовленные изделия из правой таблички,
пропорционально разделив между ними списанную сумму.
Как можно это реализовать при помощи таблицы значений? Каким образом выводить
на экран таблицу значений для корректировки? - если вдруг мне надо количество
поменять или счет (и все субсчета соответственно)?
А некоторые поля, типа наименования списываемого материала, мне нужно еще и
из справочника выбирать.
Для себя я сделала компромиссный вариант: вставила в таблицу колонку под названием
"тип операции" и в зависимости от ее значения (списание или приход) делаю при
проведении документа разные обработки строчки. Но может быть можно сделать это
как-то понагляднее?
За хороший совет скажу большое спасибо.
--------------------------------------------
Ниже привожу вариант, предложенный недавно в почте:
____________________________________________________________
Можно, конечно, сливать/распаковывать вторую таблицу через строку неогр. длины,
но я бы посоветовал (особенно, если таблицы близки по структуре) просто завести
"служебное" поле типа число=1 или 2. При открытии дока исходную можно разлить
на две таблицы (в форме) методами Сортировать() и Выгрузить().
Если же таблицы ДОЛЖНЫ иметь одинаковую длину (очень частый случай) достаточно
что-то типа:
Выгрузить(Т1,,,"1,2,3,4");
Выгрузить(Т2,,"5,6,7"); //см документацию
Успехов.
ЗЫ. Не люблю я неограниченные строки... (хотя готовить и умею)
---------------------------------------------
Света, возьмите на заметку, может подойдет.
_____________________________________________________________
В строчную часть документа ввести реквизит, который будет выполнять
роль флага, определяющего, к какой таблице относится строка. Все
строки хранятся в одной таблице, но при открытии документа
(Процедура ПриОткрытии() ) создаются несколько объектов
"ТаблицаЗначений", копирующих многострочную часть, потом перебираются
все строки документа и в зависимости от значения флага строка
записывается в соответствующую таблицу значений. После перебора
всех строк данные из нужной таблицы перегружаются в многострочную
часть, а, скажем, если в форму добавить закладки, то в процедуре
ПриВыбореЗакладки() многострочная часть переписывается в свою
таблицу, а другая таблица загружается в табличную часть
документа. В процедуре ПриЗаписи() данные всех таблиц
записываются в многострочную часть. Вот такая идея.
Программировать очень просто, но много рутины. Зато можно
иметь не две таблицы, а больше.
------------------------------------------------
Что-то похожее на предыдущий вариант
_____________________________________________________________
ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр()
А как сделать чтоб в этой таблицы работали функции редактирования строки ?
Ручками писать -тривиально, но грустно :((
Спасибо
------------------------------------------------
Ну что же, бывают и гручтные моменты :)
Теперь немного объясню, для чего мне понадобилось заниматься таким извращением
через длинные строки.
Дело в том, что мой документ и не документ вовсе, а обработка, которая должна
хранить свою табличку. А хранить ее проще в документе. И формирует она расходные
накладные по большому числу клиентов одновременно. Причем количество клиентов
не зафиксировано, поэтому стандартная табличная часть не подошла. Она не позволяет
добавлять колонки. Сначала я написал совершенно тупую схему, когда у меня 10
колонок для товаров, а в строках шли клиенты. Такую штуку еще можно проводить.
А потом ассортимент у клиента вырос настолько, что стал больше, чем клиентов.
И тогда пришлось отложить многострочную часть и поставить на ее место таблицу
значений, в которой строки - это товары, а с каждым новым клиентом добавляются
четыре новых столбца: кол*,цена*,сумма*,НП*,
где * - номер клиента, который равен порядковому номеру значения в списке значений
клиентов.
И при выборе клиента у меня предыдущие четыре колонки по текущему клиенту прячутся,
а показываются уже существующие или заводятся новые.
По итогам заполнения этой таблицы формируются расходные накладные, а остаток
товара переводится с экспедитора на склад.
Как это работает, очень понравилось моему клиенту. Можно было бы делать движения
регистров прямо отсюда, но когда форма закрыта (при групповом перепроведении)
у меня нет желания в ОбработкеПроведения() выдергивать из длинной строки свою
таблицу, да и проще оказалось создавать нужное количество документов, тем более
что там же создаются документы по списанию недостачи, оприходование излишков
и начисление задолженности на экспедитора по недостаче.
Еще моим хорошим знакомым мне был предложен вариант, когда в табличной части
добавлена колонка "клиент" и при смене клиента из табличной части перезаполнять
ТЗ товаром только для этого клиента. В этом случае можно было бы перепроводить
документ в потоке, но мне показалось, что возни будет еще больше, тем более что
уже сделанное не вызывает нареканий.
Еще один, на мой взгляд совсем "драконовский" вариант - хранить табличную часть
в подчиненном справочнике, но это может понадобиться только в самых изощренных
случаях.
Детали не описываю, веря в вашу изобретательность. Так что кому понадобится -
догадаетесь сами, как это организовано.
Так что когда я говорил, что в 1С можно сделать всё - я не лукавил, другое дело,
что для этого всего может понадобиться подключать что-то внешнее и фантазию.
Ну вот вроде и всё сказал на сегодня.
Следующий выпуск будет скоро, так как есть много других вопросов.
Не хотелось утомлять вас слишком большим текстом сегодня.
Пишите мне о том, что вы хотели бы знать, но стеснялись спросить :)
Приветствуются все предложения, пожелания, а также ругательства в мой адрес.
Только хочу предупредить, что во избежание недоразумений ваши письма должны иметь
явное указание на разрешение или запрещение публикации их в рассылке.
По умолчанию считается, что письмо публиковать разрешено.
Если вы в теле письма указали адрес, я буду его тоже указывать.
Но специально из реквизитов письма адрес извлекаться не будет.
Это нормально и общепринято. Не так ли?
Впрочем, как известно, известные люди имеют в своем использовании больше денежных
знаков...
Так что решать вам, светиться или отсиживаться.
До встречи, господа!
Написать ведущему krug@tula.net
Адрес рассылки: http://subscribe.ru/catalog/inet.review.cool1c
Архив рассылки: http://subscribe.ru/archive/inet.review.cool1c