Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Войти | Зарегистрироваться )



История благодарностей участнику Batchir ::: Спасибо сказали: 1426 раз
Дата поста: В теме: За сообщение: Спасибо сказали:
24.03.09, 20:00 Особенности использования группового оператора вхождения
язык запросов 1С:Предприятия версии 8.1.10 и более поздних добавлена обобщенная форма оператора "В"/ "НЕ В". В разделе поясняются особенности выполнения этого оператора, учет которых позволит повысить производительность запросов.

Групповой оператор вхождения

Оператор вхождения имеет вид:<Выражение> В (<Список значений>)

Оператор вхождения является одним из операторов сравнения, определенных в языке запросов 1С:Предприятия, и принимает значение "Истина", если значение его левого операнда присутствует в списке значений из правого операнда. Список значений может задаваться в виде:
  • списка выражений;
  • параметра, значением которого является коллекция значений;
  • вложенного запроса.


Если список значений задан вложенным запросом, то возможно использование обобщенной формы оператора вхождения - группового оператора вхожденияsad.gif<Выражение 1>, ..., <Выражение N>) В (<Вложенный запрос>)


Вложенный запрос должен определять выборку из N колонок.

Групповой оператор вхождения принимает значение "Истина", если запись (<Выражение 1>, ..., <Выражение N>) совпадает с одной из записей выборки, определяемой вложенным запросом. Например, пусть левым операндом является списокsad.gif1, 2, 3)


Если результатом вложенного запроса является выборка:1, 1, 1
2, 2, 2
2, 2, 3


то результатом группового оператора вхождения будет "Ложь", а если результатом вложенного запроса является выборка:1, 1, 1
1, 2, 3
2, 2, 3


то результатом группового оператора вхождения будет "Истина".

Наряду с оператором вхождения ("В") в языке запросов предусмотрен оператор не вхождения ("НЕ В"), результатом которого является отрицание оператора "В" с такими же операндами. Все, сказанное про особенности выполнения оператора "В", относится и к оператору "НЕ В".

Реализация группового оператора вхождения

В отличие от простого оператора вхождения, аналог которого имеется в большинстве СУБД (оператор IN языка SQL), групповой оператор вхождения не имеет точных аналогов в SQL. Поэтому при использовании группового оператора вхождения важно учитывать механизм его перевода в SQL. Оператор вида:



(<Выражение 1>, ..., <Выражение N>) В (
ВЫБРАТЬ <Колонка 1>, ..., <Колонка N>
ИЗ <Источники>
ГДЕ <Условие>
)

при выполнении его на СУБД будет иметь вид:


EXISTS(
SELECT 1
FROM <Источники>
WHERE (<Условие>) AND <Выражение 1> = <Колонка 1> AND ... AND <Выражение N> = <Колонка N>
)

Если вложенный запрос содержит агрегатные функции и/или раздел СГРУППИРОВАТЬ ПО, то групповой оператор вхождения вида:


(<Выражение 1>, ..., <Выражение N>) В (
ВЫБРАТЬ <Колонка 1>, ..., <Колонка N>
ИЗ <Источники>
ГДЕ <Условие 1>
СГРУППИРОВАТЬ ПО <Список группировки>
ИМЕЮЩИЕ <Условие 2>
)

на языке SQL будет записан так:


EXISTS(
SELECT 1
FROM <Источники>
WHERE <Условие 1>
GROUP BY <Список группировки>
HAVING (<Условие 2>) AND <Выражение 1> = <Колонка 1> AND ... AND <Выражение N> = <Колонка N>
)


Замечания о скорости выполнения

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

Короткие таблицы

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

Индексы

Необходимо учитывать, что запрос, вложенный в оператор EXISTS будет выполнен многократно при проверке условия отбора для каждой записи. Поэтому, если таблицы, используемые во вложенном запросе, могут содержать большое количество записей, то поиск в них необходимо ускорить посредством определения подходящих индексов:
  • используйте в качестве значений колонок <Колонка 1>, ..., <Колонка N> только наименования полей таблиц (не выражения);
  • выберите среди полей, используемых в качестве значений колонок <Колонка 1>, ..., <Колонка N> такое, значения которого реже всего повторяются (наиболее селективное поле), и включите индексирование по этому полю;
  • не используйте агрегатные функции и группировки в запросе, вложенном в групповой оператор вхождения;
  • включайте наиболее селективные поля в список группового оператора вхождения. Например, при проверке остатков на складах по позициям номенклатуры из табличной части документа "РасходныйОрдерНаТовары", на который указывает параметр "ДокументСсылка", следующий запрос будет выполняться медленно из-за того, что в таблице Документ.РасходныйОрдерНаТовары.Товары по группе полей (Номенклатура, ХарактеристикаНоменклатуры, Качество) невозможно построить индекс.



ВЫБРАТЬ
Док.Номенклатура.Представление КАК НоменклатураПредставление,
Док.Номенклатура.Представление КАК НоменклатураПредставление,
Док.Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаХраненияОстатковПредставление,
Док.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
Док.СерияНоменклатуры КАК СерияНоменклатуры,
Док.Качество КАК Качество,
СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент

/ Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЧИСЛО(15,3))) КАК ДокументКоличество,
ЕСТЬNULL(МАКСИМУМ(Остатки.КоличествоОстаток), 0) КАК ОстатокКоличество
ИЗ
Документ.РасходныйОрдерНаТовары.Товары КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(,
Склад = &Склад И (Номенклатура, ХарактеристикаНоменклатуры, Качество) В (
ВЫБРАТЬ
Док.Номенклатура, Док.ХарактеристикаНоменклатуры, Док.Качество
ИЗ
Документ.РасходныйОрдерНаТовары.Товары КАК Док
ГДЕ
Док.Ссылка = &ДокументСсылка
И НЕ Док.Номенклатура.Комплект
) И &ДокументПередачи = ДокументПередачи) КАК Остатки
ПО
Док.Номенклатура = Остатки.Номенклатура
И Док.ХарактеристикаНоменклатуры = Остатки.ХарактеристикаНоменклатуры
И Док.Качество = Остатки.Качество
И ((НЕ Док.СерияУказываетсяПриОтпускеСоСклада И Остатки.СерияНоменклатуры = Док.СерияНоменклатуры) ИЛИ
(Док.СерияУказываетсяПриОтпускеСоСклада И Остатки.СерияНоменклатуры = &ПустаяСерия))
ГДЕ
Док.Ссылка = &ДокументСсылка
СГРУППИРОВАТЬ ПО
Док.Номенклатура,
Док.ХарактеристикаНоменклатуры,
Док.СерияНоменклатуры,
Док.Качество,
&ДокументПередачи
ИМЕЮЩИЕ
ЕСТЬNULL(МАКСИМУМ(Остатки.КоличествоОстаток), 0) < СУММА(ВЫРАЗИТЬ(Док.Количество *
Док.Коэффициент
/ Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЧИСЛО(15,3)))

Следующий запрос отличается тем, что в групповой оператор вхождения добавлено поле "Склад", по которому в таблице "Документ.РасходныйОрдерНаТовары.Товары" имеется индекс. В результате время выполнения запроса существенно уменьшилось.


ВЫБРАТЬ
Док.Номенклатура.Представление КАК НоменклатураПредставление,
Док.Номенклатура.Представление КАК НоменклатураПредставление,
Док.Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаХраненияОстатковПредставление,
Док.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
Док.СерияНоменклатуры КАК СерияНоменклатуры,
Док.Качество КАК Качество,
СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент
/ Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЧИСЛО(15,3))) КАК ДокументКоличество,
ЕСТЬNULL(МАКСИМУМ(Остатки.КоличествоОстаток), 0) КАК ОстатокКоличество
ИЗ
Документ.РасходныйОрдерНаТовары.Товары КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(,
(Склад, Номенклатура, Качество, ХарактеристикаНоменклатуры) В (
ВЫБРАТЬ
Док.Ссылка.Склад, Док.Номенклатура, Док.Качество, Док.ХарактеристикаНоменклатуры
ИЗ
Документ.РасходныйОрдерНаТовары.Товары КАК Док
ГДЕ
Док.Ссылка = &ДокументСсылка
И НЕ Док.Номенклатура.Комплект
) И &ДокументПередачи = ДокументПередачи) КАК Остатки
ПО
Док.Ссылка.Склад = Остатки.Склад
И Док.Номенклатура = Остатки.Номенклатура
И Док.Качество = Остатки.Качество
И Док.ХарактеристикаНоменклатуры = Остатки.ХарактеристикаНоменклатуры
И ((НЕ Док.СерияУказываетсяПриОтпускеСоСклада И Остатки.СерияНоменклатуры = Док.СерияНоменклатуры) ИЛИ
(Док.СерияУказываетсяПриОтпускеСоСклада И Остатки.СерияНоменклатуры = &ПустаяСерия))
ГДЕ
Док.Ссылка = &ДокументСсылка
СГРУППИРОВАТЬ ПО
Док.Номенклатура,
Док.ХарактеристикаНоменклатуры,
Док.СерияНоменклатуры,
Док.Качество,
&ДокументПередачи
ИМЕЮЩИЕ
ЕСТЬNULL(МАКСИМУМ(Остатки.КоличествоОстаток), 0) < СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент
/ Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК ЧИСЛО(15,3)))


Временные таблицы

Если запрос, вложенный в групповой оператор вхождения, сложный, содержит агрегатные функции, использует таблицы с большим количеством записей, то вероятно, что исполнение группового оператора вхождения будет крайне не эффективным. В этом случае целесообразно:
  • исполнить вложенный запрос отдельно и сложить его результат во временную таблицу;
  • определить во временной таблице индекс либо по всем полям, либо по наиболее селективному подмножеству полей;
  • использовать полученную временную таблицу в запросе, вложенном в групповой оператор вхождения.
Gorus,
24.03.09, 19:44 Использование функции ЕСТЬNULL()
При работе с языком запросов иногда возникает ситуация, когда требуется заменить значение NULL на некоторое другое значение. Потребность подобной операции может возникнуть, например, при получении остатков на складе для всей номенклатуры. В данной статье описывается использования функции языка запросов ЕСТЬNULL() для решения подобных задач, а также рассматриваются другие варианты решения.

Функция ЕСТЬNULL

В языке запросов реализована функция ЕСТЬNULL(), предназначение которой - заменять выражение на другое выражение в случае, если выражения имело значение NULL. Синтаксическая диаграмма данной функции выглядит так:

ЕСТЬNULL(<Проверяемое выражение>, <Выражение замены>)

Данная функция вернет значение первого параметра, в случае, если оно не является NULL, и значение второго выражения, в противном случае.

Пример:



ВЫБРАТЬ
СправочникНоменклатуры.Наименование,
ЕСТЬNULL(УчетНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = СправочникНоменклатуры.Ссылка
ГДЕ
СправочникНоменклатуры.ЭтоГруппа = ЛОЖЬ

В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.

Использование операции ВЫБОР

Для решения описанной ранее задачи можно воспользоваться операцией языка запросов ВЫБОР. Пример, как будет выглядеть запрос, аналогичный предыдущему, будет выглядеть так:



ВЫБРАТЬ
СправочникНоменклатуры.Наименование,
ВЫБОР КОГДА УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL ТОГДА 0
ИНАЧЕ УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = СправочникНоменклатуры.Ссылка
ГДЕ
СправочникНоменклатуры.ЭтоГруппа = ЛОЖЬ


Результат данного запроса будет идентичен результату запроса, приведенного в предыдущем разделе.

Использование функции ЕСТЬNULL() предпочтительней использования операции ВЫБОР по следующим причинам: запись с использованием ЕСТЬNULL() несколько компактней, что повышает читабельность запроса. Кроме того, в случае, когда проверяемое выражение является сложной функцией, в том числе агрегатной функцией, вычисление функции ЕСТЬNULL() может выполняться быстрей чем аналог, записанный с использованием функции ВЫБОР.

Особенности функции ЕСТЬNULL

Функция ЕСТЬNULL() хоть и является аналогом операции ВЫБРАТЬ с проверкой значения на NULL, тем не менее, имеет отличие. Отличие заключается в том, что в случае, если выражение функции имеет строковой или числовой тип, то выражение замены будет преобразовано к типу проверяемого выражения.

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

С числовыми выражениями ситуация аналогична: значение заменяемого выражения будет преобразовано к типу проверяемого, т.е. заменяемое выражение может быть обрезано. В случае если значение не может быть преобразовано, язык запросов закончит выполнение запроса с ошибкой. Например, с ошибкой закончится попытка преобразования числа 1000 в тип Число(2).
MATEVI,
24.03.09, 19:36 Особенности связи с виртуальной таблицей остатков
Введение

При создании торговых конфигураций часто возникает необходимость проверить наличие необходимого количество товара на складе перед оформлением документов. Задача эффективно решается при помощи языка запросов, путем связи табличной части документа с таблицей остатков и дальнейшей проверкой остатков. В данном разделе мы рассмотрим некоторые тонкие моменты, которые могут подстерегать разработчика при решении данной задачи.

Проверка остатков

Запрос для получения остатков для товаров, присутствующих в табличной части, выглядит примерно так:



ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
РасходнаяНакладнаяСостав.Ссылка = &Документ


На что следует обратить внимание. Во первых, в случае, когда на складе не будет присутствовать товар, поле УчетНоменклатурыОстатки.КоличествоОстаток будет иметь значение NULL, поэтому любое сравнение с ним даст неизвестный результат, подобный значениюЛОЖЬ. Этот факт нужно учитывать при составлении запроса. Так, например, если нам необходимо получить товары, количество которых на складе меньше, чем количество товара в документе, то нам следует использовать запрос типа:



ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
РасходнаяНакладнаяСостав.Ссылка = &Документ И
(УчетНоменклатурыОстатки.КоличествоОстаток < РасходнаяНакладнаяСостав.Количество ИЛИ
УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL)


В данном запросе мы проверили, что товара на складах меньше, чем необходимо или товара на складах нет вообще.

Следующий момент, на который обратим внимание, это ограничение объема расчета остатков. В нашем примере виртуальная таблица остатков сначала рассчитает остатки всех товаров, а затем свяжет с табличной частью товары, которые в ней присутствовали. Для обеспечения расчета остатков только тех товаров, которые присутствовали в накладной, можно передать ограничивающее условие в таблицу остатков (см. раздел Использование отборов в запросах с виртуальными таблицами). Преобразованный запрос будет выглядеть так:



ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
Номенклатура В (
ВЫБРАТЬ Номенклатура
ИЗ Документ.РасходнаяНакладная.Состав
ГДЕ Ссылка = &Документ)) КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
РасходнаяНакладнаяСостав.Ссылка = &Документ И
(УчетНоменклатурыОстатки.КоличествоОстаток < РасходнаяНакладнаяСостав.Количество ИЛИ
УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL)


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


ВЫБРАТЬ
Состав.Номенклатура,
Состав.Количество,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
(ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
Номенклатура В (
ВЫБРАТЬ
Документ.РасходнаяНакладная.Состав.Номенклатура
ИЗ
Документ.РасходнаяНакладная.Состав
ГДЕ
Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
) КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура
ГДЕ
(УчетНоменклатурыОстатки.КоличествоОстаток < Состав.Количество
ИЛИ (УчетНоменклатурыОстатки.КоличествоОстаток) ЕСТЬ NULL )


Как видно из запроса, сначала мы рассчитали общее количество каждого товара в документе, а затем произвели все необходимые операции со сравнением остатков.

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


ВЫБРАТЬ
Состав.Номенклатура,
Состав.Номенклатура.Представление КАК Представление,
Состав.Количество,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
(ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
Номенклатура В (
ВЫБРАТЬ
Документ.РасходнаяНакладная.Состав.Номенклатура
ИЗ
Документ.РасходнаяНакладная.Состав
ГДЕ
Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
) КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура
ГДЕ
(УчетНоменклатурыОстатки.КоличествоОстаток < Состав.Количество
ИЛИ (УчетНоменклатурыОстатки.КоличествоОстаток) ЕСТЬ NULL )


Пользователю необходимо будет выдавать поле Представление. Пример вывода:



Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Сообщить("Обнаружены товары в недостаточном количестве:");
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Представление + ": требуется " + Строка(Выборка.Количество)
+ " остаток: " + Строка(Выборка.КоличествоОстаток));
КонецЦикла;
КонецЕсли;


Заключение

В данном раздле были рассмотрены некоторые особенности выполнения проверок остатков номенклатуры. Были приведены примеры упрощенных запросов, для получения необходимой информации для проверки остатков. Данными примерами можно пользоваться при создании реальных запросов проверки.
candrey, MATEVI,
24.03.09, 19:30 Выборка из результата запроса всех вошедших в него значений группировок
При обходе результата запроса нередко возникает необходимость получения всех значений группировок внутри какой-либо другой группировки. Такая возможность может понадобиться, например, при выводе кросс отчета. Для обеспечения такой возможности в объекте ВыборкаИзРезультатаЗапроса предусмотрен третий параметр функции Выбрать().

Рассмотрим пример. Пусть нам необходимо получить кросс-отчет по остаткам номенклатуры на различных складах. Номенклатуру необходимо вывести в строках, склады - в колонках. Запрос для получения остатков будет выглядеть так:

ВЫБРАТЬ
    УчетНоменклатурыОстатки.Номенклатура КАК Номенклатура,
    УчетНоменклатурыОстатки.Номенклатура.Представление,
    УчетНоменклатурыОстатки.Склад КАК Склад,
    УчетНоменклатурыОстатки.Склад.Представление,
    УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ИТОГИ СУММА(КоличествоОстаток) ПО
    ОБЩИЕ,
    Номенклатура,
    Склад


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


ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
Пока ВыборкаНоменклатура.Следующий() Цикл
    ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
    ТабДок.Вывести(ОбластьНоменклатура);


Для обхода внутри номенклатуры всех складов, присутствующих в результате запроса, получим вложенную выборку от выборки номенклатуры, с указанием третьего параметра "ВСЕ":

ВыборкаСклад = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Склад", "ВСЕ");
Пока ВыборкаСклад.Следующий() Цикл
    ОбластьСклад.Параметры.Заполнить(ВыборкаСклад);
    ТабДок.Присоединить(ОбластьСклад);
КонецЦикла;


В случае если необходимо построить несколько отдельных кросс-таблиц для каждого значения некой группировки, необходимо в качестве третьего параметра выборки указать имя группировки, внутри которой необходимо получить все значения, вошедшие в запрос. Пример:

ВыборкаСклад = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Склад", "Организация");


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

Пример вывода кросс-отчета с использованием выборок из результата запроса показан в демонстрационной конфигурации "Примеры ИТС", в отчете "ОстаткиНаСкладах".
Small sa, vbi,
24.03.09, 19:07 Особенность выполнения функции ПОДСТРОКА() языка запросов
Раздел содержит описание особенности выполнения функции ПОДСТРОКА() языка запросов в клиент-серверном варианте работы и вытекающие из нее рекомендации по построению запросов.

Функция ПОДСТРОКА()

В языке запросов 1С:Предприятия функция ПОДСТРОКА() в формате ПОДСТРОКА(<Исходная строка>, <Начало>, <Длина>) может применяться к данным строкового типа и позволяет выделить фрагмент <Исходной строки>, начинающийся с символа номер <Начало> (символы в строке нумеруются с 1) и длиной <Длина> символов. Результат вычисления функции ПОДСТРОКА() имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если <Исходная строка> имеет неограниченную длину и параметр <Длина> не является константой или превышает 1024.

Вычисление функции ПОДСТРОКА() на SQL сервере

В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется.

В большинстве случаев эти правила не оказывают влияния на выполнение запроса 1С:Предприятия, однако есть случаи, когда для исполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса.

Например, запрос:



ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1


завершается аварийно с сообщением:

Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618

Это происходит потому, что вычисленная Microsoft SQL Server максимальная длина строки, которая является результатом выражения:


ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,


равна 4000 символов. Поэтому длина записи, состоящей из двух таких полей превышает 8000 байт, разрешенные для выполнения операции сортировки.

В связи с описанной особенностью исполнения функции SUBSTRING() на SQL Server использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ(). В частности, приведенный пример можно переписать в виде:


ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
MATEVI, novosys,
21.03.09, 11:04 Особенности методов менеджера регистра сведений
У объекта РегистрСведенийМенеджер имеется набор методов для доступа к данным регистра сведений.

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

По своему действию эти методы аналогичны виртуальным таблицам СрезПервых и СрезПоследних. Их единственное преимущество перед использованием запроса - краткость записи.

Методы Получить(), ПолучитьПервое() и ПолучитьПоследнее() отличаются тем, что предназначены для получения только значений ресурсов. Методы возвращают структуру, содержащую элементы, соответствующие ресурсам регистра.

Основным отличием описанных методов является то, что методы Получить(), ПолучитьПервое() и ПолучитьПоследнее() выдают значения одной записи, а методы СрезПервых() и СрезПоследних() позволяют получить несколько записей.

В методах Получить(), ПолучитьПервое() и ПолучитьПоследнее() структура возвращается в любом случае. То есть если в регистре нет записей с указанными значениями отбора, то будет возвращена структура, содержащая значения ресурсов по умолчанию. Таким образом, методы Получить(), ПолучитьПервое() и ПолучитьПоследнее() целесообразно использовать в тех случаях, когда, с точки зрения прикладной задачи, нужны данные одной записи, и значение по умолчанию вполне может быть использовано как не установленное значение для этой комбинации измерений, то есть соответствовать отсутствию записи. Например, если хранятся цены товаров, то получение цены 0 (ноль) вполне может отвечать логике использования не установленной цены. В этом случае удобно использовать эти методы и не анализировать в модуле имеется ли запись в регистре или нет. Однако если наличие или отсутствие записей с указанной комбинацией измерений существенно, то нужно использовать запрос или методы СрезПервых() и СрезПоследних() для периодических регистров сведений.

С точки зрения производительности, методы СрезПервых() и СрезПоследних() оптимизированы именно для получения данных одной записи. Разумеется, в конкретных ситуациях (в зависимости от структуры измерений, варианта хранения базы данных и т.д.) соотношение может быть различным.
antonn91,
21.03.09, 11:04 Манипулирование записями регистров без использования регистратора
В 1С:Предприятии 8 все регистры, кроме регистров сведений, всегда связаны с регистраторами. Регистры сведений могут быть независимыми или также подчиненными регистратору. В этом разделе мы опишем работу с регистрами, подчиненными регистраторам.

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

Однако в 1С:Предприятии 8 существует возможность изменять записи регистров без участия документа. При этом следует учитывать, что каждая запись регистра всегда подчинена одному и только одному регистратору (документу). Поэтому с точки зрения "времени жизни" записи всегда подчинены конкретным регистраторам. Однако, записи могут изменяться без участия самого документа. Главное, чтобы в них имелась ссылка на документ.

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

При изменении записей регистра можно использовать набор записей, входящий в коллекцию движений документа (свойство Движения объекта ДокументОбъект). Однако это не обязательно. Для изменения записей регистра можно использовать и набор записей созданный с помощью менеджера регистра.

Таким образом, чтобы изменить записи регистра необходимо:
  • создать набор записей;
  • установить отбор по определенному регистратору;
  • прочитать набор;
  • изменить записи набора;
  • записать набор.


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



//Выберем всех регистраторов регистра
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| УчетНоменклатуры.Регистратор
|ИЗ
| РегистрНакопления.УчетНоменклатуры КАК УчетНоменклатуры";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Обойдем регистраторов
Пока Выборка.Следующий() Цикл
Сообщить("Изменение записей по регистратору: " + Выборка.Регистратор);
//Для каждого регистратора выполним изменение набора записей
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.Реквизит1 = "Тест";
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;


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

Заметим, что для добавления большого количества записей по одному регистратору существует возможность записывать записи без замещения. Это регулируется параметром метода Записать(). Такая возможность позволяет добавлять записи, не помещая их всех одновременно в оперативную память.

В регистрах расчетов кроме отбора по регистратору для набора записей можно также установить отбор по другим значениям измерений (только по равенству). Это позволяет выполнить изменение части записей, подчиненных одному регистратору.
antonpresn, dx7, Rema, tim_2014,
21.03.09, 10:48 Методологические вопросы различий регистра бухгалтерии и регистров накопления
В 1С:Предприятии реализованы объекты регистры накопления и регистры бухгалтерии. Данные объекты очень похожи и решают похожие задачи, но есть между ними и различия.
И регистр накопления, и регистр бухгалтерии решают одну и ту же задачу: накопление каких либо показателей в разрезе измерений. Различие заключается в том, что регистр накопления имеет жесткую структуру измерений и не поддерживает двойную запись, регистр бухгалтерии, наоборот, поддерживает двойную запись и возможность гибкой настройки измерений конечными пользователями. Эти различия обусловлены тем, что регистр накопления предназначен для организации ведения учета в какой-либо узкой области хозяйственной деятельности предприятия. Например, ведение взаиморасчетов, складской учет, учет денежных средств и так далее. Ввод данных в регистры накопления осуществляется с помощью различных документов, данные извлекаются специализированными отчетами, или используются при регламентных операциях. Обычно состав задач, решаемых с помощью регистра накопления, известен заранее, и поэтому разработчик прикладного решения может определить жесткую и эффективную структуру регистра накопления.
Регистр бухгалтерии, в свою очередь, предназначен для организации учета практически всей хозяйственной деятельности предприятия. В результате того, что в регистре отображаются все хозяйственные операции предприятия, образуется замкнутая система, в которой очень важна поддержка двойной записи для исключения возникновения различных ошибок. Кроме того, в связи с тем, что с помощью регистра бухгалтерии автоматизируется много различных областей хозяйственной деятельности предприятия, к нему предъявляются требования возможности настройки дополнительных разрезов учета и определения для каждой области учета собственных разрезов учета. Так как областей учета у предприятий много, и невозможно предусмотреть автоматизацию их всех, то обычно учет по некоторым областям учета ведется вручную. Это означает, что пользователь вводит в данные непосредственно в регистр бухгалтерии, что предъявляет достаточно жесткие требования по удобству ввода этой информации. Все эти факторы приводят к тому, что разработчик прикладного решения не может предусмотреть все возможные варианты использования регистра бухгалтерии, вследствие чего организация структуры регистра бухгалтерии сложнее регистра накопления.

Структура

Все реквизиты регистра делятся на три категории: измерения, ресурсы, реквизиты. Измерения предназначены для задания разрезов учета, по которым будет извлекаться информация. Ресурсы задают собственно значения различных показателей учета, которые могут быть получены в разрезе различных измерений. Реквизиты служат для описания конкретной записи движения. В таблице итогов хранятся только данные из полей измерений и ресурсов. При этом одному ресурсу может соответствовать несколько полей в итогах, для хранения различной информации: остаток, приход и расход по данному ресурсу. Реквизиты регистра так же делятся на системные и пользовательские. Системные реквизиты – это поля, определенные системой и непосредственно недоступные пользователю для настройки. Некоторые системные реквизиты могут настраиваться опосредованно. Пользовательские реквизиты – это измерения, ресурсы и реквизиты, которые разработчик определяет, добавляя в описание регистра соответствующие объекты метаданных.

Организация регистров

Регистры накопления и бухгалтерии построены, практически, по одной схеме: есть таблица движений и таблица итогов (для регистра бухгалтерии несколько таблиц итогов). Таблица движений является основной, в ней хранятся первичные данные. В принципе, на основе этих данных можно получить любую требуемую информацию. Таблица итогов является вспомогательной и служит для оптимизации получения некоторой информации. Данные, хранящиеся в таблице итогов, являются вторичными по отношению к таблице движений и могут быть восстановлены из данных таблицы движений. Информация в таблице итогов поддерживается в актуальном состоянии, то есть при каждом изменении таблицы движений сразу же обновляется информация в таблице итогов. Для того что бы эта операция производилась эффективно, у таблицы итогов определен индекс, содержащий период и все измерения регистра. Это накладывает ограничение на количество измерений у регистра, так как в MS SQL Server существует ограничение на количество полей входящих в индекс – не больше 16 полей. Таким образом, для регистра накопления можно определить 15 пользовательских измерений. Шестнадцатое поле занято системным измерением период. При этом нужно учитывать, что каждое измерение составного типа занимает 3 поля вместо одного. Это не означает, что нельзя сделать регистр с количеством измерений больше 15, но при разработке такого регистра нужно учитывать этот факт и стараться в последние измерения, не попадающие в индекс, выносить измерения с маленьким количеством возможных значений. К таким значениям могут относиться перечисления, справочники с маленьким количеством элементов, или измерения количество значений, которых ограничено логикой конфигурации.

Дополнительные измерения (субконто)

Как выше упоминалось регистр, бухгалтерии позволяет пользователю вести учет для различных областей учета в различных разрезах аналитики. Для этого разработчик должен указать план счетов для реквизита "Счет", максимальное количество субконто, тип значения субконто, а так же план видов характеристик, который будет содержать виды субконто. Счет служит для указания, к какой области учета относится данная запись, и какой набор субконто ведется по данной области учета. Для определения набора субконто, используются табличная часть ВидыСубконто, в которой хранятся виды субконто. Этот набор видов субконто определяет количество и состав субконто у записи, для которой в качестве значения реквизита счет выбрали ссылку на данный счет. То есть регистр бухгалтерии можно представить как совокупность регистров накопления, где для каждого счета имеющего уникальный набор субконто (область учета) определяется собственный регистр накопления, плюс регистр накопления для учета по счетам без субконто плюс оборотный регистр для учета корреспонденций между счетами. Например, у нас есть план счетов следующего содержания:
Счет Субконто1 Субконто2 Субконто3
01 Основные средства Склады
20 Подразделения Статьи затрат
41 Товары Партии Склады

Данную структуру можно представить в виде следующих регистров накопления:
  • Измерения: ОсновныеСредства, Склад; Ресурсы: Сумма, Количество
  • Измерения: Подразделения, СтатьиЗатрат; Ресурсы: Сумма, Количество
  • Измерения: Товар, Партия, Склад; Ресурсы: Сумма, Количество
  • Измерения: Счет; Ресурсы: Сумма, Количество
  • Измерения: СчетДт, СчетКт Ресурсы: Сумма, Количество (Оборотный)

Разработчик может предусмотреть ведение в одном регистре бухгалтерии по одному счету несколько независимых параллельных учетов. Даная возможность задействуется с помощью признаков учета субконто и признака только обороты. Например, есть регистр бухгалтерии, в котором ведется суммовой и количественный учет, то есть у регистра определены два ресурса - сумма и количество. В плане счетов есть 10 счет, на котором ведется учет материалов. Данный учет ведется в разрезе материалов и складов, на которых эти материалы хранятся. В разрезе складов ведется только количественный учет. Для определения этого свойства у вида субконто Склады на 10 счете сбрасывается признак суммового учета. Тогда можно представить, что по 10 счету ведется два паралелльных учета:
  • Измерения: Материал; Ресурсы: Сумма
  • Измерения: Материал, Склад; Ресурсы: Количество

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

Платой за гибкость, широкие функциональные возможности и удобства использования регистра бухгалтерии является некоторое снижение скорости работы, по сравнению с регистром накопления. Поэтому при проектировании системы важно выделить области учета, которые требуют большое количество аналитических разрезов, связаны с большим объемом данных. Такие области учета лучше реализовывать на основе регистров накопления, так как в данном случае можно создать более продуманную и эффективную структуру регистров. Это позволит построить хорошо масштабируемую, производительную систему учета.
Lefer,
21.03.09, 9:52 Рекомендации по использованию в конфигурации составных типов данных
В 1С:Предприятии при описании структуры информации, хранящейся в базе данных, в большинстве случаев допускается создание полей (реквизитов, измерений и т.д.) с составными типами данных. Это позволяет хранить в одном поле данные различных типов. С одной стороны, это является достаточно удобной возможностью, но, с другой стороны, использование составных типов оказывает существенное влияние на работу системы. Поэтому к использованию этой возможности следует подходить весьма внимательно.

Для понимания технологических особенностей работы системы с полями, имеющими составной тип можно ознакомиться с разделами диска ИТС: "Особенности хранения составных типов данных" и "Влияние ограничений длины ключа индексов на проектирование объектов метаданных".

Если принимается решение использовать в некотором поле составной тип данных, то рекомендуется исходить из принципа минимизации состава типов входящих в это поле.

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

Если используются только ссылочные типы данных (ссылки на справочники, перечисления, документы и т.д.), то объем хранимой информации в поле не зависит от количества выбранных типов. Однако при работе с полями ссылочных типов система при выполнении различных операций анализирует каждый тип, входящий в составной тип. Соответственно количество выбранных типов может влиять на скорость работы некоторых операций, как при конфигурировании, так и при работе системы в режиме 1С:Предприятие. Таким образом, рекомендуется включать в такие поля только те типы, которые действительно необходимо использовать в реализуемой бизнес-логике.

Особо следует отметить возможность выбора наборов типов (таких как ЛюбаяСсылка, СправочникСсылка, ДокументСсылка и т.д). Выбор этих наборов типов фактически означает включение всех ссылочных типов (для ЛюбаяСсылка) или всех ссылочных типов по Справочникам, Документам и т.д.. При использовании этих наборов типов (а не явном выборе всех конкретных ссылочных типов) любой добавляемый объект метаданных будет автоматически добавлять новый тип к составному типу поля. С точки зрения нагрузки на систему, выбор этих наборов типов ничем не отличается от явного выбора всех конкретных ссылочных типов. Поэтому использовать эти наборы типов рекомендуется только в особых случаях, когда действительно необходимо обеспечить хранение в некотором поле любого из возможных ссылочных типов. На практике, такая потребность встречается достаточно редко. Не рекомендуется использовать выбор этих наборов типов с целью быстрого выбора типа поля при конфигурировании или для того, чтобы не изменять конфигурацию в дальнейшем, если возникает потребность расширить состав типов.

Следует учитывать, что при описании у плана видов характеристик типа значения характеристик, фактически, также задается набор типов для полей, у которых в качестве типа выбирается тип, определяемый данным планом видов характеристики, а также для субконто регистра бухгалтерии, если данный план видов характеристик выбран для соответствующего плана счетов. Таким образом, все приведенные рекомендации по составным типам относятся и к описанию типа значения характеристик.
andreykyiv@bigmir.net,
21.03.09, 9:47 Особенности использования варианта индексирования "Индексировать с доп. упорядочиванием"
При описании в метаданных реквизитов различных объектов существует возможность установить свойство Индексировать. Это свойство позволяет разработчику конфигурации указать системе необходимость построения в базе данных отдельного индекса по соответствующему реквизиту.

Кроме варианта "Индексировать" в данном свойстве для большинства объектов можно установить вариант "Индексировать с доп. упорядочиванием". Данный вариант предназначен, прежде всего, для использования в динамических списках.

В варианте "Индексировать" строится индекс непосредственно по реквизиту. Индекс также дополняется ссылкой, чтобы обеспечить определенный порядок записей в индексе при повторяющихся значениях реквизита.

В варианте "Индексировать с доп. упорядочиванием" индекс строится по реквизиту, а также по некоторому полю, которое обычно используется для упорядочивания объектов этого типа. Для справочника индекс в зависимости от основного представления дополняется кодом или наименованием. А для документа, индекс дополняется датой. Этот индекс также дополняется ссылкой.

В варианте "Индексировать" в динамическом списке может быть обеспечен эффективный просмотр больших объемов информации с упорядочиванием по данному реквизиту, так как для этого будет использоваться созданный индекс.

В варианте "Индексировать с доп. упорядочиванием" в динамическом списке может быть обеспечен эффективный просмотр больших объемов информации с отбором по значению данного реквизита и с упорядочиванием, соответствующим основному упорядочиванию для данного объекта. В этом случае наличие индекса включающего реквизит, по которому выполняется отбор, и поля основного упорядочивания позволит системе использовать индекс при просмотре списка.

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

Таким образом при определении варианта свойства Индексировать следует исходить из того, какие варианты выборки информации необходимо оптимизировать в первую очередь. Например, если требуется просмотр списка с отбором по реквизиту, то имеем смысл использовать вариант "Индексировать с доп. упорядочиванием". А если индекс нужен, например, только для поиска с помощью запроса объектов по данному реквизиту без упорядочивания, то лучше использовать вариант "Индексировать", чтобы создаваемые индекс требовал меньше ресурсов системы.

Подробно состав индексов формируемых системой при различных сочетаниях свойств метаданных приводится в с статье "Индексы таблиц базы данных".
Henkin, nhbnh, VladRd,
21.03.09, 9:17 Признаки учета и признак Балансовый измерений и ресурсов регистра бухгалтерии
Регистр бухгалтерии предоставляет два независимых механизма, которые в сочетании позволяют описать структуру и взаимосвязи полей регистра бухгалтерии.

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

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

Примером небалансовых ресурсов и измерений могут служить валютная сумма и валюта. Для таких ресурсов и измерений не проверяется равенство сумм дебета и кредита и, соответственно, по ним невозможно получить баланс. В отличие от балансовых ресурсов и измерений, которые являются характеристикой проводки в целом, небалансовые являются характеристикой только одной корреспонденции. По этой причине в регистре бухгалтерии с поддержкой корреспонденции для небалансовых ресурсов и измерений создается два поля: ВалютаДт, ВалютаКт - для измерения Валюта, ВалютнаяСуммаДт, ВалютнаяСуммаКт – для ресурса ВалютнаяСумма. Пользователь имеет возможность определить валюту и валютную сумму проводки для каждой корреспонденции отдельно. Если для ресурса валютная сумма и измерения валюта определен признак учета, то пользователь сможет ввести значение только для той корреспонденции, в которой выбран счет, поддерживающий валютный учет. В частности, могут возникать ситуации, когда оба счета поддерживают валютный учет, тогда пользователю будет предоставлена возможность определить валюту учета и валютную сумму для обеих корреспонденций.
xxxrandrxxx,
17.03.09, 14:03 Загрузка курсов валют в конфигуации 7.7, 8.1
Написана обработка для загрузки курсов в конфигурации 7.7
MATEVI, Vofka,
14.03.09, 13:33 Загрузка курсов валют в конфигуации 7.7, 8.1
Цитата(Pepe @ 14.03.09, 13:05) *
А для 7-ки?

Пока не планируется, а дальше посмотрим.

Тут схема такая: файлы на сервере не хранятся.
1. Отсылаем запрос, происходит проверка пользователя на регистрацию на нашем форуме
2. После подверждения регистрации создается файл по переданным параметрам (дата начала, дата конца, валюта) на сервере, индивидуально для каждого пользователя.
3. Производится загрузка созданного файла, считывание информации из него и удаление на сервере.

Если кто-то подскажет как в 7-ке выполнить переход к url, т.е мне нужно выполнить например преход на www.pro1c.org.ua и передать некоторые параметры для создания файла загрузки, тогда начну реализацию загрузки курсов на 7.7.
Иными словами мне нужно для создания файла выполнить команду ЗапуститьПриложение("http://www.pro1c.org.ua") с переданными параметрами для создания файла. После выполнеиня этой команды откроется браузер и выполниться создание. МОжно сделать такое, но неудобно. При загузке курсов два раза будет открываться браузер (1- при создании файла, 2- при удалении)
В 8-ке я делаю это с помощью поля html документа.
Alkima,
13.03.09, 21:57 Загрузка курсов валют в конфигуации 7.7, 8.1
С 11 марта 2009 года на нашем форуме стартовал сервис загрузки официальных курсов валют НБУ в программы 1С:Предприятие. В отличии от типовых обработок по загрузке курсов, встроенных в конфигурации 1С, пользователи форума получают возможность БЕСПЛАТНО загружать курсы за любой интервал времени. Это устраняет необходимость вводить курсы валют вручную, и, таким образом, повышает оперативность и точность информации.

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

На текущий момент в нашу базу данных произведена загрузка курсов за период начиная с 96 года.

Список валют доступных для загрузки:

031 - AZM - Азербайджанский манат
036 - AUD - Австралийский доллар
124 - CAD - Канадский доллар
156 - CNY - Китайский юань
203 - CZK - Чешская крона
208 - DKK - Датская крона
233 - EEK - Эстонская крона
348 - HUF - Венгекрский форинт
352 - ISK - Исландская крона
392 - JPY - Японская Иена
398 - KZT - Тенге (казахский)
428 - LVL - Латвийский лат
440 - LTL - Литовский лит
498 - MDL - Молдавский лей
578 - NOK - Норвежская крона
643 - RUB - Российский рубль
702 - SGD - Сингапурский доллар
703 - SKK - Словацкая крона
756 - CHF - Швейцарский франк
795 - TMM - Манат (Туркменистан)
826 - GBP - Фунт стерлингов (Соединенное королевство Великобритания)
840 - USD - Доллар США
860 - UZS - Узбекский сум
949 - TRY - Новая турецкая лира
960 - XDR - СДР (специальные права заимствования)
974 - BYR - Белорусский рубль
978 - EUR - Евро (Страны - участницы Европейского Союза)
985 - PLN - Злотый (Польша)

Написаны обработки для платформ 7.7 и 8.1, которые вы можете скачать в прикрепленных к этой теме файлах

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

8.2 (управляемая форма) Ver Galaxy87 - [attachment=687:pro1c_Lo...rses_8_2.zip]
18.01.2017
Если при запуске обработки появляется ошибка
Цитата
Процедура или функция с указанным именем уже определена (СтрШаблон)
Функция <<?>>СтрШаблон(Знач СтрокаШаблон,

то надо скачать обработку для версии 8.3: [attachment=1046:pro1c_Lo...rses_8_3.zip]


8.1 Ver pro1c - [attachment=201:pro1c_Lo...ourses_8.zip]

7.7 Ver pro1c - [attachment=489:pro1c_Lo...ourses_7.zip] обновлена 18.01.2012

7.7 Ver Sarius- [attachment=163:pro1c_Lo...ourses_7.zip]

Сервис загрузки межбанковского курса валют: http://pro1c.org.ua/index.php?showtopic=13673
=AnDY=, a190275, Acid, AdminS, AgA, al0nchik, alex040269, Andrij-ko, Ashen, attila, ayranit, birhof, bugary, ch1mera, craneua, diachik, endru, fastiv, fillya, gersik, igor_gk, ILL, iv74, jul66, jully_cv, klolle, kov0404, krusgenicky, Letavitsa, light07, liksoft, Limonka11, Lumix, Lyudaua, malexmen, marachka, MATEVI, maximsagaydak, mcltd, media, mister-x, murashko, nikk911, oleg.zhukotsky, omelcha, pablo, pqrst, rtgorodok, sanpost, sasha007, serejkin, sicheva, twozero, VasiliyAlibabaev, vatikan, vitalyon, Vladal, VSB, W-divin, yeomanwarder, zaytc, АндрейГ, Погремушка, _aalex_,
12.03.09, 9:31 Отбор по видам договоров
Вы что то сделали не так.
Только что сделал:
1. Добавил перечисление УточнениеВидаДоговора (ОплптаУслуг,ОплатаТовара)
2. Добавил реквизит договора УточнениеВидаДоговора (тип перечисление УточнениеВидаДоговора)
3. Добавил реквизит на форму.
4. В режиме 1С предприятие у некотороых договоров по которым есть движения по 361 счету отредактировал реквизит УточнениеВидаДоговора (выбрал ОплатаУслуг)
5. Сформировал отчет ОСВ по счету 361, в отборе добавил строку Договори.УточнениеВидаДоговора равно ОплатаУслуг

ИТОГ: ОСВ сформировалась с нужными договорами
Vava,
24.02.09, 12:07 Ссылки на полезную литературу
1C v77 - SQL-версия - Установка, Настройка, Программирование, Работа  
скачать

Описание встроенного языка 7.7
скачать

Описание встроенного языка 8.0
скачать

1C v81 - Простые примеры разработки (Радченко) - в формате CHM
скачать

1C v77 - 1C-Предприятие - Программирование для всех - Базовые объекты и расчеты (Бартеньев О.В.)
скачать

1C v77 - 1C и механизм OLE Automation
скачать

C v77 & v80 - Сайт ИнфоСтарт - Off-line версия раздела Статьи 1С
скачать

1C v77 & v80 - Сайт ИнфоСтарт - Off-line версия раздела Программы 1С 
скачать

1Cv81-Практическое пособие разработчика - примеры и типовые приемы(Радченко,2007)
скачать
alexdnet, Bob Chan, dts, gryphus, Malena, miha74, nickeeee, saha, Vladal, Vofka, W-divin,
20.02.09, 20:41 Требования к разработке внешних обработок обслуживания торгового оборудования
Требования к разработке внешних обработок обслуживания торгового оборудования

В данном разделе содержится описание структуры внешних обработок обслуживания торгового оборудования, используемых в текущих конфигурациях системы 

"1С:Предприятие 8.1", в которых используется подключение торгового оборудования, и методика их создания. Также раздел содержит внешнюю обработку, которую можно использовать в качестве основы для создания обработок обслуживания конкретных экземпляров торгового оборудования.

ВАЖНО
Данная методика неприменима для более ранних редакций, разработанных для системы "1С:Предприятие 8.0"! 

В данной статье рассмотренно следующее:

Общие сведения 
Общие требования 
Процедуры и функции 
  Общие 
  Функция "ПолучитьВерсиюAPI" 
  Функция "ПолучитьОписание" 
  Функция "СоздатьОбъектДрайвера" 
  Функция "ПолучитьОписаниеСобытий" 
  Функция "Подключить" 
  Функция "ТестУстройства"
  Функция "ПолучитьИмяИсточникаВнешнегоСобытия" 
  Процедура "Отключить" 
  Процедура "НастроитьОборудование"
  Дисплеи покупателя 
  Функция "Очистить" 
  Функция "Вывод" 
  ККМ в режиме Off-Line 
  Функция "ПолучитьПараметрыВыгрузки" 
  Функция "ВыгрузитьТовары" 
  Функция "ЗагрузитьОтчет" 
  Функция "ОтчетЗагружен" 
  ККМ в режиме On-Line 
  Функция "ОбработатьСобытие" 
  Функция "ОбработатьРезультатЗапроса" 
  Сканеры штрихкода 
  Функция "ОбработатьСобытиеСШК" 
  Процедура "СобытиеОбработано"
  Терминалы сбора данных 
  Функция "НачатьВыгрузку" 
  Функция "ВыгрузитьСтроку" 
  Функция "ЗавершитьВыгрузку" 
  Функция "НачатьЗагрузку" 
  Функция "ЗагрузитьСтроку" 
  Функция "ЗавершитьЗагрузку"
  Фискальные регистраторы 
  Функция "ПолучитьПараметрыНаличнойОплаты" 
  Функция "XОтчет" 
  Функция "ZОтчет" 
  Функция "Сумма" 
  Функция "ОткрытьЧек" 
  Функция "ПечататьСтроку" 
  Функция "АннулироватьЧек" 
  Функция "ЗакрытьЧек"
  Функция "НапечататьСтроки"
  Электронные весы 
  Функция "Тарирование" 
  Функция "Вес" 
  Устройства для считывания магнитных карт 
  Функция "ОбработатьСобытиеСМК" 
  Процедура "СобытиеОбработано" 
  Электронные весы Off-Line 
  Функция "НачатьВыгрузку" 
  Функция "Выгрузить" 
  Функция "ЗавершитьВыгрузку"
  Считывателей RFID меток
  Функция "ПолучитьКоличествоМетокRFID"
  Функция "ПрочитатьДанныеИзМетокRFID"
  Функция "ЗаписатьДанныеВМеткиRFID"
  Функция "ОткрытьСессиюRFID"
  Функция "ЗакрытьСессиюRFID"
  Функция "ОбработатьСобытиеОтRFID"
  Процедура "СобытиеОбработано"
  Эквайринговые системы
  Функция "ОплатитьПлатежнойКартой"
  Функция "ВернутьПлатежПоПлатежнойКарте"
  Функция "ОтменитьПлатежПоПлатежнойКарте"
  Функция "ИтогиДняПоКартам"
  Функция "ПоддерживаетсяСверкаИтогов"
Шаблон обработки обслуживания




Общие сведения

Обработка обслуживания представляет обработку системы "1С:Предприятие", предназначенную для работы с торговым оборудованием. Основным предназначением обработок обслуживания является локализация изменений в конфигурации при необходимости добавления новых моделей торгового оборудования (модели оборудования, не поддерживаемые конфигурацией) или при необходимости модификации существующего кода, осуществляющего взаимодействие с торговым оборудованием. В более ранних редакциях типовых конфигураций в основном разработанные для "1С:Предприятие 8.0" обработки обслуживания были реализованы в виде форм обработки "Торговое оборудования". 



Общая схема взаимодействия с торговым оборудованием при помощи внешних обработок обслуживания приведена на рисунке. Конфигурация взаимодействует с обработками обслуживания посредством стандартизованного их интерфейса (API). Обработки обслуживания с помощью внешних компонент взаимодействуют с драйверами (или любым другим программным обеспечением) конкретного экземпляра подключенного торгового оборудования, таким образом, исполняя роль "посредника". В случае, когда возникает внешнее событие, конфигурация передаёт информацию о нём соответствующей обработке обслуживания, которая и обрабатывает это событие. Таким образом, для подключения новых моделей торгового оборудования нет более необходимости вносить изменения в саму конфигурацию. Настройка параметров работы устройств (порт, к которому подключено устройство, скорость передачи данных и т.д.) также выполняется средствами обработки обслуживания - каждая обработка обслуживания обязана иметь форму настройки параметров работы поддерживаемых ей моделей торгового оборудования (моделей оборудования, для которых эта обработка была создана).


ПРИМЕЧАНИЕ
Обработка обслуживания может поддерживать работу только с одной внешней компонентой торгового оборудования одного вида торгового оборудования (только фискальные регистраторы, только сканеры штрихкода и т.д.). В случае, если необходимо реализовать поддержку нескольких устройств разного вида или разных компонент одного вида, то для каждого из них необходимо будет создать собственную обработку обслуживания.
Общие требования

Настоящие требования определяют интерфейс взаимодействия ОО торгового оборудования с типовыми конфигурациями "1С:Предприятие 8". Интерфейс ОО можно условно разделить на две части. Первая часть - общая, определяет обязательный набор функций и методов входящий во все ОО. Вторая часть - функциональная, определяет обязательный набор функций и методов специфичный для каждого вида торгового оборудования. Также ОО может содержать дополнительные (вспомогательные) функции и/или методы, а также переменные, определяемые разработчиком обработки.

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

  • Обработка обслуживания должна быть реализована в виде внешней обработки системы "1С:Предприятие 8.1".
  • Обработка должна иметь форму, используемую по умолчанию, содержащую описание обработки обслуживания.
  • Обработка должна содержать справочную информацию, в которой раскрывается назначение обработки обслуживания и описание формы настройки (какие существуют параметры и зачем они нужны; рекомендации по настройке параметров и т.д.).
К модулю обработки обслуживания предъявляются следующие требования:

  • Модуль должен содержать экспортируемую функцию "ПолучитьВерсиюAPI"
  • Модуль должен содержать экспортируемую функцию "ПолучитьОписание"
  • Модуль должен содержать экспортируемую функцию "СоздатьОбъектДрайвера"
  • Модуль должен содержать экспортируемую функцию "ПолучитьОписаниеСобытий"
  • Модуль должен содержать экспортируемую функцию "Подключить"
  • Модуль должен содержать экспортируемую процедуру "Отключить"
  • Модуль должен содержать экспортируемую функцию "ТестУстройства"
  • Модуль должен содержать экспортируемую процедуру "НастроитьОборудование"
  • Модуль должен содержать экспортируемую процедуру
  • "ПолучитьИмяИсточникаВнешнегоСобытия"
  • Модуль должен содержать экспортируемые процедуры и функции, специфичные для вида торгового оборудования, поддерживаемого данной обработкой обслуживания.
Экспортируемые процедуры и функции модуля обработки обслуживания

Процедуры и функции, общие для всех обработок обслуживания

Данные процедуры и функции являются обязательными для обработок обслуживания, поддерживающих версии API 2.ХХ, вне зависимости от вида поддерживаемого обработкой обслуживания торгового оборудования.

Функция "ПолучитьВерсиюAPI"

Данная функция предназначена для получения информации о номере версии интерфейса (API) обработок обслуживания, поддерживаемого данной обработкой. Текущая версия API - "2.1". Функция используется конфигурацией в момент загрузки обработки обслуживания в информационную базу.


ВАЖНО
Допускается изменение набора экспортируемых модулем обработки обслуживания процедур и функций (фактически, обязательной для всех обработок обслуживания является только эта функция), но с одним ограничением: конфигурация определяет состав экспортируемых процедур и функций по номеру версии API по следующему правилу - целая часть номера версии API определяет базовый набор процедур и функций, дробная часть - дополнения к базовому набору. Таким образом, в случае, если конфигурация поддерживает API версии X.0 она также будет работать со всеми обработками обслуживания с API версий X.YZ.  

 


// Функция возвращает номер версии API, поддерживаемой обработкой обслуживания.
  //
  // Номер версии задаётся следующим образом: Ver = Vmajor + Vminor / 100.0.
  // Например, в случае, если данная функция возвращает значение "2.01", это  
  // означает, что данная обработка имеет версию "2.1", полностью поддерживает
  // версию "2.0" и содержит некоторые дополнительные элементы.
  // В случае, если отличается целая часть версии (например, "1.1"), то это
  // означает, что данная обработка несовместима с версией API "2.1".
  //
  // Функция является обязательной для любой версии API.
  //
  // Параметры:
  // Нет
  //
  // Возвращаемое значение:
  // <Число> - Версия API обработки обслуживания.
  //

  Функция ПолучитьВерсиюAPI() Экспорт



Функция "ПолучитьОписание"

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

ВАЖНО 
Следует отличать номер версии API от номера версии обработки обслуживания. В то время, как версия API определяет версию интерфейса взаимодействия обработки обслуживания, версия обработки определяет реализацию этого интерфейса. Пояснить сказанное можно на следующем примере: в опубликованной обработке обслуживания была обнаружена ошибка, которая впоследствии была исправлена. Для публикации исправленной обработки необходимо изменить номер её версии. Номер версии API при этом не изменяется. Также следует пояснить роль идентификатора: идентификатор позволяет конфигурации отличать одну обработку обслуживания от другой. Идентификатор не зависит от номера версии обработки: две обработки обслуживания с одинаковыми идентификаторами но разными версиями считаются одной и той же обработкой обслуживания. В качестве идентификатора необходимо использовать текстовое представление глобального уникального идентификатора (GUID).  


// Функция возвращает описание текущей обработки обслуживания
  // (API v2.0).
  //
  // Данная функция позволяет серверу получить информацию об обработке
  // обслуживания. Функция является обязательной для версий 2.X API.
  //
  // Параметры:
  // Нет
  //
  // Возвращаемое значение:
  // <Структура> - Структура, содержащая описание текущей обработки.
  // Структура имеет следующие поля:
  //
  // Вид - <ПеречислениеСсылка.ВидыТорговогоОборудования>
  // - Вид торгового оборудования, поддерживаемый  
  // данной обработкой обслуживания.
  //
  // СписокМоделей - <Массив>
  // - Список поддерживаемых обработкой моделей
  // торгового оборудования.
  //
  // Наименование - <Строка>
  // - Наименование обработки обслуживания.
  //
  // Описание - <Строка>
  // - Описание обработки обслуживания.
  //
  // ВерсияОбработки - <Число>
  // - Номер версии обработки обслуживания  
  // (не версии API!!!).
  // Данный параметр используется при
  // обновлении.
  // Номер версии задаётся следующим образом:
  // Ver = Vmajor + Vminor / 100.0.
  //
  // Идентификатор - <Строка>
  // - Строковое представление уникального
  // идентификатора, соответствующего данной
  // обработке обслуживания.
  //
  //

  Функция ПолучитьОписание() Экспорт




Функция "СоздатьОбъектДрайвера"

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


ВАЖНО
Следует отметить, что в обязанности данной функции не входит подключение оборудования, она создаёт лишь объект, необходимый для последующего с ним взаимодействия. Подключение оборудования осуществляется при помощи функции "Подключить"


// Функция создаёт объект драйвера.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Выходной параметр; объект драйвера торгового
  // оборудования.
  //
  // Модель - <Строка>
  // - Модель торгового оборудования, для которой
  // создаётся экземпляр драйвера.
  //
  // Параметры - <Строка>
  // - Параметры подключаемого торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //
   
  Функция СоздатьОбъектДрайвера(Объект, Модель, Параметры) Экспорт




Функция "ПолучитьОписаниеСобытий"

Данная функция возвращает таблицу имён внешних событий, которые может генерировать драйвер поддерживаемых обработкой обслуживания устройств. Функция используется в момент инициализации работы с оборудованием.
ВАЖНО
В том случае, если при работе с оборудованием не возникают внешние события, функция обязана вернуть пустую таблицу.


// Функция возвращает набор событий драйвера и параметры их обработки для
  // заданной модели торгового оборудования.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ТаблицаЗначений> - Таблица значений, содержащая информацию о внешних
  // событиях, генерируемых драйвером.
  // Таблица имеет следующие колонки:
  // "ИмяСобытия" - <Строка> - Имя внешнего события.
  //

  Функция ПолучитьОписаниеСобытий(Объект) Экспорт


Функция "Подключить"

Данная функция осуществляет подключение устройства: установку соединения, проверку состояния и т.д.


// Функция осуществляет подключение устройства.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //
   
  Функция Подключить(Объект) Экспорт


Функция "ТестУстройства"

Данная функция осуществляет проверку корректности настройки подключаемого оборудования.
ВАЖНО
В обязанности данной функции входит проверка корректности подключения оборудования. В ходе её выполнения, безусловно, допускается его подключение, но до завершения работы функции оборудование необходимо отключить. Следует также отметить, что, в случае обнаружения ошибок, функция обязана записать описание ошибки и осмысленную рекомендацию для пользователя, как ему следует действовать дальше, параметр Объект.ОписаниеОшибки.


// Функция осуществляет проверку правильности настройки и подключения
  // торгового оборудования.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера устройства, проверка
  // которого предполагается.
  //
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //
   
  Функция ТестУстройства(Объект) Экспорт


Функция "ПолучитьИмяИсточникаВнешнегоСобытия"

Функция возвращает имя источника внешнего события генерируемое при подключении внешней компонентой. По уникальному для сеанса подключения имени производится поиск из конфигурации обработки обслуживания для обработки полученного события.



// Возвращает имя источника внешнего события
  // (API v2.1)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера устройства.
  //
  // Возвращаемое значение:
  // <Строка> - Имя внешнего источника события.
  //
   
  Функция ПолучитьИмяИсточникаВнешнегоСобытия(Объект) Экспорт


Процедура "Отключить"

Данная процедура осуществляет отключение устройства: завершение соединения, удаление временных файлов и так далее.

ВАЖНО
Данная процедура не должна удалять объект драйвера. В её обязанности входит только разрыв соединения с устройством.




// Процедура осуществляет отключение устройства.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
   
  Процедура Отключить(Объект) Экспорт



Процедура "НастроитьОборудование"

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

 


// Процедура осуществляет вызов формы настройки торгового оборудования.
  // (API v2.0)
  //
  // Параметры:
  // Модель - <Строка>
  // - Модель настраиваемого оборудования.
  //
  // Параметры - <Структура>
  // - Входной/выходной параметр; структура параметров.
  //
   
  Процедура НастроитьОборудование(Модель, Параметры) Экспорт






Функции, обязательные для модулей обработок обслуживания дисплеев покупателя

Данные функции являются обязательными только для модулей обработок обслуживания дисплеев покупателя. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.



Функция "Очистить"

Данная функция осуществляет очистку дисплея покупателя. 

 


// Функция осуществляет очистку дисплея покупателя.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера дисплея покупателя, очистка
  // которого предполагается.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //
   
  Функция Очистить(Объект) Экспорт


Функция "Вывод"

Данная функция осуществляет вывод текста на дисплей покупателя. 

ПРИМЕЧАНИЕ
Передаваемая строка может содержать символы перевода строки. 

 


// Функция осуществляет вывод строк на дисплей покупателя.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера дисплея покупателя, очистка
  // которого предполагается.
  //
  // Данные - <Массив>
  // - Массив строк, выводимые на дисплей.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция Вывод(Объект, Данные) Экспорт


Функции, обязательные для модулей обработок обслуживания ККМ, подключаемых в режиме Off-Line

Данные функции являются обязательными только для модулей обработок обслуживания ККМ, подключаемых в режиме Off-Line. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ПолучитьПараметрыВыгрузки"

Данная функция возвращает параметры обмена данными с текущей моделью ККМ. 

 


// Функция возвращает параметры выгрузки товаров в ККМ Off-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Штрихкоды - <Булево>
  // - Выходной параметр; данная модель
  // ККМ позволяет выгружать только те товары,
  // для которых назначены штрихкоды.
  //
  // ВесовойТовар - <Булево>
  // - Данная модель ККМ поддерживает работу с
  // весовыми товарами.
  //
  // ТипыШтрихкодов - <Массив>
  // - Массив типов штрихкодов, поддерживаемых ККМ.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //  

  Функция ПолучитьПараметрыВыгрузки(Объект, Штрихкоды, ВесовойТовар, ТипыШтрихкодов) Экспорт




Функция "ВыгрузитьТовары"

Данная функция осуществляет выгрузку таблицы товаров в ККМ. 

 


// Функция осуществляет выгрузку таблицы товаров в ККМ, подключенную в режиме Off-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Товары - <ТаблицаЗначений>
  // - Таблица товаров, подлежащих загрузке в ККМ.
  // Таблица имеет следующие колонки:
  // ПЛУ - <Число>
  // - Идентификатор товара на кассе.
  // Номенклатура - <СправочникСсылка.Номенклатура>
  // - Номенклатура.
  // ВесовойТовар - <Булево>
  // - Товар является весовым.
  // ЕдиницаИзмерения - <СправочникСсылка.ЕдиницыИзмерения>
  // - Единица измерения номенклатуры.
  // ХарактеристикаНоменклатуры - <СправочникСсылка.ХарактеристикиНоменклатуры>
  // - Характеристика номенклатуры.
  // СерияНоменклатуры - <СправочникСсылка.СерииНоменклатуры>
  // - Серия номенклатуры.
  // Цена - <Число>
  // - Цена номенклатуры.
  // КодТовара - <Число>, <Строка>
  // - Код весового товара (для весовых товаров),
  // или штрихкод (для штучного товара).
  //
  // Возвращаемое значение:  
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ВыгрузитьТовары(Объект, Товары) Экспорт




Функция "ЗагрузитьОтчет"

Данная функция осуществляет загрузку отчёта о продажах за смену из ККМ. 

 


// Функция осуществляет загрузку отчёта о продажах из ККМ, подключаемой в режиме Off-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Отчет - <ТаблицаЗначений>
  // - Выходной параметр; таблица, содержащая данные  
  // о продажах за смену. Таблица содержит
  // следующие колонки:
  // ПЛУ - <Число>
  // - Идентификатор проданного (возвращённого)
  // товара.
  // Количество - <Число>
  // - Количество проданного (>0) или
  // возвращённого (<0) товара.
  // Цена - <Число>  
  // - Цена за единицу товара.
  // Сумма - <Число>
  // - Сумма позиции: >0 - продажа, <0 - возврат.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ЗагрузитьОтчет(Объект, Отчет) Экспорт


Функция "ОтчетЗагружен"

Данная функция вызывается после успешной обработки загруженного из ККМ отчёта о продажах.

ВАЖНО
Данная функция обязана закрыть смену на ККМ, или вывести предупреждение для пользователя о необходимости сделать это самостоятельно. 

 


// Функция вызывается после того, как был загружен и обработан отчёт о продажах.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ОтчетЗагружен(Объект) Экспорт


Функции, обязательные для модулей обработок обслуживания ККМ, подключаемых в режиме On-Line

Данные функции являются обязательными только для модулей обработок обслуживания ККМ, подключаемых в режиме On-Line. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ОбработатьСобытие"

Данная функция осуществляет обработку внешнего события от ККМ, подключенной в режиме On-Line. 

 


// Функция осуществляет обработку события ККМ, подключаемой в режиме On-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Событие - <Строка>
  // - Название события.
  //
  // Данные - <Строка>
  // - Данные, связанные с событием.
  //
  // Параметры - <Структура>, <Неопределено>
  // - Выходной параметр; структура, описывающая
  // операцию, инициируемую данным событием.
  // В случае, если событие не инициирует
  // новую операцию, возвращается "Неопределено".
  // Данная структура имеет следующие поля:
  // Операция - <Строка>
  // - Строка, содержащая одно из следующих
  // значений: "ЗапросИнформации", "Чек".
  // Операция "ЗапросИнформации" инициируется,
  // когда ККМ необходимо получить информацию
  // о некотором товаре. Операция "Чек"
  // инициируется после закрытия чека на ККМ.
  // Штрихкод - <Строка>
  // - Данное поле существует в случае,
  // если Операция = "ЗапросИнформации".
  // Оно содержит штрихкод запрашиваемого
  // товара.
  // Товары - <ТаблицаЗначений>
  // - Данное поле существует в случае,
  // если Операция = "Чек".
  // Оно содержит таблицу позиций чека.
  // Таблица имеет следующие колонки:
  // Штрихкод - <Строка>
  // - Штрихкод продаваемого товара.
  // Количество - <Число>
  // - Количество товара.
  // Цена - <Число>
  // - Цена товара.
  // Сумма - <Число>
  // - Сумма позиции чека.
  // Возврат - <Булево>
  // - Данное поле существует в случае,
  // если Операция = "Чек".
  // Оно содержит признак того, что
  // сформированный чек является чеком
  // на возврат.
  //
  // Наличные - <Число>
  // - Данное поле существует в случае,
  // если Операция = "Чек".
  // Оно содержит сумму оплаты наличными.
  //
  // Безнал - <Число>
  // - Данное поле существует в случае,
  // если Операция = "Чек".
  // Оно содержит сумму оплаты безнал.
  //
  // НомЧека - <Число>
  // - Данное поле существует в случае,
  // если Операция = "Чек".
  // Оно содержит номер текущего чека.
  //
  // НомСмены - <Число>
  // - Данное поле существует в случае,
  // если Операция = "Чек".
  // Оно содержит номер текущей смены.
  //  
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ОбработатьСобытие(Объект, Событие, Данные, Параметры) Экспорт




Функция "ОбработатьРезультатЗапроса"

Данная функция осуществляет обработку результата запроса информации о товаре, запрошенной ККМ. 

 


// Функция осуществляет обработку запроса ККМ о товаре.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Данные - <Структура>, <Неопределено>
  // - В случае, если товар не был найден,
  // или его добавление в чек невозможно,
  // данный параметр принимает значение
  // Неопределено. Иначе данный параметр
  // содержит структуру, описывающую товар,
  // информация о котором запрашивается.
  // Данная структура имеет следующие поля:
  // Номенклатура - <СправочникСсылка.Номенклатура>
  // - Номенклатура, которой соответствует
  // отсканированный штрихкод.
  // ЕдиницаИзмерения - <СправочникСсылка.ЕдиницыИзмерения>
  // - Единица измерения номенклатуры.
  // ХарактеристикаНоменклатуры - <СправочникСсылка.ХарактеристикиНоменклатуры>
  // - Характеристика номенклатуры.
  // СерияНоменклатуры - <СправочникСсылка.СерииНоменклатуры>
  // - Серия номенклатуры.
  // Качество - <СправочникСсылка.Качество>
  // - Качество номенклатуры.
  // Количество - <СправочникСсылка.Количество>
  // - Количество номенклатуры.
  // Цена - <Число>
  // - Цена за единицу номенклатуры.
  // Скидка - <Число>
  // - Процент скидки (>0) или наценки (<0).
  // НомерСекции - <Число>
  // - Номер секции, которой соответствует
  // данная продажа.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //
   

  Функция ОбработатьРезультатЗапроса(Объект, Данные) Экспорт




Функции, обязательные для модулей обработок обслуживания сканеров штрихкода

Данные функции являются обязательными только для модулей обработок обслуживания сканеров штрихкода. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ОбработатьСобытиеСШК"

Данная функция осуществляет обработку внешнего события, связанного со сканированием штрихкода. 

ПРИМЕЧАНИЕ
Перед завершением работы функции желательно отключить генерацию внешних событий сканером. 

 


// Функция осуществляет обработку внешних событий торгового оборудования.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Событие - <Строка>
  // - Строка, идентифицирующая событие.
  //
  // Данные - <Строка>
  // - Данные, связанные с событием.
  //
  // ШК - <Строка>
  // - Выходной параметр; считанный сканером штрихкод.
  //
  // ТипШК - <ПланыВидовХарактеристикСсылка.ТипыШтрихкодов>
  // - Тип штрихкода либо пустая ссылка в случае,
  // если тип определить невозможно.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ОбработатьСобытиеСШК(Объект, Событие, Данные, ШК, ТипШК) Экспорт




Процедура "СобытиеОбработано"

Данная процедура вызывается после обработки сканирования штрихкода.

ВАЖНО
В случае, если в предыдущей функции генерация внешних событий была приостановлена, процедура обязана её возобновить. 

 


// Процедура вызывается, когда система готова принять следующее событие от устройства.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //

  Процедура СобытиеОбработано(Объект) Экспорт


Функции, обязательные для модулей обработок обслуживания терминалов сбора данных

Данные функции являются обязательными только для модулей обработок обслуживания терминалов сбора данных. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "НачатьВыгрузку"

Данная функция вызывается в момент инициализации процесса выгрузки данных в терминал.

 


// Функция осуществляет инициализацию процедуры выгрузки данных в терминал
  // сбора данных.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция НачатьВыгрузку(Объект) Экспорт





Функция "ВыгрузитьСтроку"

Данная функция осуществляет выгрузку строки в терминал сбора данных.

 


// Функция осуществляет выгрузку строки в терминал сбора данных.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Штрихкод - <Строка>
  // - Штрихкод товара.
  //
  // Номенклатура - <СправочникСсылка.Номенклатура>
  // - Номенклатура.
  //
  // ЕдиницаИзмерения - <СправочникСсылка.ЕдиницыИзмерения>
  // - Единица измерения номенклатуры.
  //
  // ХарактеристикаНоменклатуры - <СправочникСсылка.ХарактеристикиНоменклатуры>
  // - Характеристика номенклатуры.
  //
  // СерияНоменклатуры - <СправочникСсылка.СерииНоменклатуры>
  // - Серия номенклатуры.
  //
  // Качество - <СправочникСсылка.Качество>
  // - Качество.
  //
  // Цена - <Число>
  // - Цена номенклатуры.
  //
  // Количество - <Число>
  // - Количество номенклатуры.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции
  //

  Функция ВыгрузитьСтроку(Объект, Штрихкод, Номенклатура, ЕдиницаИзмерения,
  ХарактеристикаНоменклатуры, СерияНоменклатуры,
  Качество, Цена, Количество) Экспорт


Функция "ЗавершитьВыгрузку"

Данная функция вызывается после выгрузки последней строки данных в терминал.

 


// Функция осуществляет деинициализацию процедуры выгрузки данных в терминал
  // сбора данных.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ЗавершитьВыгрузку(Объект) Экспорт


Функция "НачатьЗагрузку"

Данная функция вызывается перед загрузкой данных из терминала.

 


// Функция осуществляет инициализацию процедуры загрузки данных из терминала
  // сбора данных.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Количество - <Число>
  // - Выходной параметр; количество записей в терминале
  // сбора данных.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция НачатьЗагрузку(Объект, Количество) Экспорт


Функция "ЗагрузитьСтроку"

Данная функция вызывается при необходимости загрузить строку данных из терминала.

 


// Функция осуществляет загрузку строки из терминала сбора данных.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Штрихкод - <Строка>
  // - Штрихкод, соответствующий данной номенклатуре.
  //
  // Количество - <Число>
  // - Выходной параметр; количество номенклатуры.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ЗагрузитьСтроку(Объект, Штрихкод, Количество) Экспорт


Функция "ЗавершитьЗагрузку"

Данная функция вызывается при необходимости завершить загрузку данных из терминала.

 


// Функция осуществляет деинициализацию процедуры загрузки данных из терминала
  // сбора данных.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ЗавершитьЗагрузку(Объект) Экспорт


Функции, обязательные для модулей обработок обслуживания фискальных регистраторов

Данные функции являются обязательными только для модулей обработок обслуживания фискальных регистраторов. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ПолучитьПараметрыНаличнойОплаты"

Данная функция используется для определения возможности регистрации наличной оплаты от юридических лиц и ПБОЮЛ.

 


// Функция возвращает параметры отражения в чеке наличной оплаты от юридических
  // лиц.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // НомерОтдела - <Число>
  // - Выходной параметр; номер отдела, используемый
  // для вывода чека.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция ПолучитьПараметрыНаличнойОплаты(Объект, НомерОтдела) Экспорт


Функция "XОтчет"

Данная функция вызывается при необходимости снять отчёт за смену без гашения.

 


// Функция осуществляет снятие X-отчёта на ФР.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // Пароль - <Число>
  // - Пароль пользователя ФР.
  //
  // НомерЧека - <Число>
  // - Выходной параметр; номер чека ФР.
  //
  // НомерСмены – <Число>
  // - Выходной параметр; номер текущей смены ФР.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция XОтчет(Объект, Пароль, НомерЧека, НомерСмены) Экспорт


Функция "ZОтчет"

Данная функция вызывается при необходимости снять отчёт за смену с гашением.

 


// Функция осуществляет снятие Z-отчёта на ФР.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // Пароль - <Число>
  // - Пароль пользователя ФР.
  //
  // НомерЧека - <Число>
  // - Выходной параметр; номер чека ФР.
  //
  // НомерСмены – <Число>
  // - Выходной параметр; номер текущей смены ФР.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция ZОтчет(Объект, Пароль, НомерЧека, НомерСмены) Экспорт


Функция "Сумма"

Данная функция вызывается при необходимости внесения или изъятия суммы в кассу.

 


// Функция осуществляет внесение (сумма > 0) или изъятие (сумма < 0) суммы на ФР.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // Пароль - <Число>
  // - Пароль пользователя ФР.
  //
  // Сумма - <Число>
  // - Вносимая сумма.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция Сумма(Объект, Пароль, Сумма) Экспорт


Функция "ОткрытьЧек"

Данная функция вызывается при необходимости открыть новый чек.

 


// Функция осуществляет открытие чека на ФР.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // Пароль - <Число>
  // - Пароль пользователя ФР.
  //
  // ЭтоВозврат - <Булево>
  // - Истина в случае, если открывается чек на возврат.
  //
  // НомерЧека - <Число>
  // - Выходной параметр; номер чека ФР.
  //
  // НомерСмены – <Число>
  // - Выходной параметр; номер текущей смены ФР.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция ОткрытьЧек(Объект, Пароль, ЭтоВозврат, НомерЧека, НомерСмены) Экспорт


Функция "ПечататьСтроку"

Данная функция вызывается при необходимости печати строки чека.

 


// Функция осуществляет печать строки чека на ФР.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // Наименование - <Строка>
  // - Описание товара, отображаемое в чеке.
  //
  // Количество - <Число>
  // - Количество выводимой номенклатуры.
  //
  // Цена - <Число>
  // - Цена выводимой номенклатуры за единицу.
  //
  // Скидка - <Число>
  // - Скидка в % на выводимую номенклатуру.
  // В случае, если это значение < 0, абсолютное
  // значение данного параметра считается наценкой.
  //
  // Отдел - <Число>
  // - Номер отдела (секции), которой соответствует данная строка.
  //
  // НДС - <Число>
  // - Ставка НДС в %
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция ПечататьСтроку(Объект, Наименование, Количество, Цена,
  Скидка, Отдел, НДС) Экспорт


Функция "АннулироватьЧек"

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

 


// Функция осуществляет аннулирование текущего открытого чека на ФР.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция АннулироватьЧек(Объект) Экспорт


Функция "ЗакрытьЧек"

Данная функция вызывается при необходимости закрыть открытый чек.

 


// Функция осуществляет закрытие текущего открытого чека на ФР.
  // (API v1.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // СуммаНал - <Число>
  // - Сумма, внесённая наличными.
  //
  // СуммаБезнал - <Число>
  // - Сумма, внесённая при помощи карты.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция ЗакрытьЧек(Объект, СуммаНал, СуммаБезнал) Экспорт


Функция "НапечататьСтроки"

Данная функция осуществляет построчную печать произвольного нефискального чека. Применяется, например, для печати слип-чеков на ФР.

 


// Функция осуществляет построчную печать нефискального чека из переданного массива строк.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера ФР.
  //
  // МассивСтрок - <Массив>
  // - Массив строк для печати.
  //
  // Ширина - <Число>
  // - Ширина чековой ленты.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат выполнения операции.
  //

  Функция НапечататьСтроки(Объект, МассивСтрок, Ширина) Экспорт


Функции, обязательные для модулей обработок обслуживания электронных весов

Данные функции являются обязательными только для модулей обработок обслуживания электронных весов. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "Тарирование"

Данная функция вызывается при необходимости установить вес тары.

 


// Функция задаёт вес тары на электронных весах.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // ВесТары - <Число>
  // - Вес тары.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция Тарирование(Объект, ВесТары) Экспорт


Функция "Вес"

Данная функция вызывается при необходимости получить вес.

 


// Функция получает текущий вес.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Вес - <Число>
  // - Выходной параметр; текущий вес.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция Вес(Объект, Вес) Экспорт


Функции, обязательные для модулей обработок обслуживания устройств для считывания магнитных карт

Данные функции являются обязательными только для модулей обработок обслуживания устройств для считывания магнитных карт. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ОбработатьСобытиеСМК"

Данная функция вызывается при необходимости обработать внешнее событие устройства для считывания магнитных карт.

ПРИМЕЧАНИЕ
Перед завершением работы функции желательно отключить генерацию внешних событий устройством. 

 


// Функция осуществляет обработку внешних событий торгового оборудования.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Событие - <Строка>
  // - Строка, идентифицирующая событие.
  //
  // Данные - <Строка>
  // - Данные, связанные с событием.
  //
  // КодКарты - <Строка>
  // - Выходной параметр; код считанной карты.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ОбработатьСобытиеСМК(Объект, Событие, Данные, КодКарты) Экспорт


Процедура "СобытиеОбработано"

Данная процедура вызывается после обработки считанного кода карты.

ВАЖНО
В случае, если в предыдущей функции генерация внешних событий была приостановлена, процедура обязана её возобновить. 

 


// Процедура вызывается, когда система готова принять следующее событие от устройства.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //

  Процедура СобытиеОбработано(Объект) Экспорт


Функции, обязательные для модулей обработок обслуживания электронных весов, подключаемых в режиме Off-Line

Данные функции являются обязательными только для модулей обработок обслуживания весов, подключаемых в режиме Off-Line. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "НачатьВыгрузку"

Данная функция вызывается при необходимости начать выгрузку данных в весы.

 


// Функция осуществляет инициализацию процедуры выгрузки данных в весы,
  // подключенные в режиме Off-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция НачатьВыгрузку(Объект) Экспорт


Функция "Выгрузить"

Данная функция вызывается при необходимости выгрузить строку данных в весы.

 


// Функция осуществляет выгрузку позиции в весы, подключенные в режиме Off-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // PLU - <Число>
  // - Номер PLU.
  //
  // КодТовара - <Число>
  // - Код товара.
  //
  // Наименование - <Строка>
  // - Наименование номенклатуры.
  //
  // Цена - <Число>
  // - Цена номенклатуры.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция Выгрузить(Объект, PLU, КодТовара, Наименование, Цена) Экспорт


Функция "ЗавершитьВыгрузку"

Данная функция вызывается после выгрузки всех необходимых строк.

 


// Функция осуществляет деинициализацию процедуры выгрузки данных в весы,
  // подключенные в режиме Off-Line.
  // (API v2.0)
  //
  // Параметры:
  // Объект - <*>
  // - Объект драйвера торгового оборудования.
  //
  // Возвращаемое значение:
  // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
  //

  Функция ЗавершитьВыгрузку(Объект) Экспорт


Функции, обязательные для модулей обработок обслуживания считывателей RFID меток

Данные функции являются обязательными только для модулей обработок обслуживания считывателей RFID меток. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ПолучитьКоличествоМетокRFID"

 


// Производит обнаружение меток в поле считывателя и возвращает в параметре количество обнаруженных меток. 
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // КоличествоМеток – <Число>
  // - Возвращается количество меток в поле считывателя
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ПолучитьКоличествоМетокRFID(Объект, КоличествоМеток) Экспорт


Функция "ПрочитатьДанныеИзМетокRFID"

 


//Считывает все данные из обнаруженных меток и возвращает в параметре структуру, содержащую идентификаторы меток и данные. 
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // КоличествоМеток – <Число>
  // - Передается количество обнаруженных
  // меток в поле считывателя
  //
  // Данные – <Структура>
  // - Возвращаются данные, прочитанные из меток
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ПрочитатьДанныеИзМетокRFID(Объект, КоличествоМеток, Данные) Экспорт


Функция "ЗаписатьДанныеВМеткиRFID"

 


// Записывает переданные данные в метки, находящиеся в поле считывателя.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // КоличествоМеток – <Число>
  // - Передается количество обнаруженных
  // меток в поле считывателя
  //
  // ДанныеДляЗаписи – <Строка>
  // - Передается строка с данными, которые
  // будут записаны во все обнаруженные метки
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ЗаписатьДанныеВМеткиRFID(Объект, КоличествоМеток, ДанныеДляЗаписи) Экспорт




Функция "ОткрытьСессиюRFID"

 


// Открывает новую сессию для чтения данных из меток, попадающих в поле считывателя.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ОткрытьСессиюRFID(Объект) Экспорт


Функция "ЗакрытьСессиюRFID"

 


// Закрывает открытую ранее сессию.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // ИгнорироватьМеткиВПоле – <Строка>
  // - Признак проверки меток в поле
  // "Истина" - если есть метки в поле,
  // то сессия не закрывается 
  // и возвращается ошибка
  // "Ложь" - если есть метки в поле,
  // то сессия закрывается и 
  // возвращается количество 
  // обнаруженных меток в поле
  //
  // КоличествоМеток – <Число>
  // - Передается количество обнаруженных
  // меток в поле считывателя
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ЗакрытьСессиюRFID(Объект, ИгнорироватьМеткиВПоле, КоличествоМеток) Экспорт


Функция "ОбработатьСобытиеОтRFID"

 


// Обрабатывает событие, пришедшее от считывателя RFID меток.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // Событие – <Строка>
  // - Имя полученного события
  //
  // Данные – <Строка>
  // - Данные полученные из компоненты
  //
  // ДанныеИзМеток – <Структура>
  // - Возвращаются полученные данные, 
  // преобразованные во внутреннюю структуру
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ОбработатьСобытиеОтRFID(Объект, Событие, Данные, ДанныеИзМеток) Экспорт


Процедура "СобытиеОбработано"

 


// Процедура вызывается, когда система готова принять следующее событие от устройства.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера RFID.
  //
  // РезультатОбработки – <Булево>
  // - Оповещает драйвер о том, что
  // событие системой было получено.
  // Параметр "ФлагСостояния" указывает 
  // на успешность обработки.
  //
  // Возвращаемое значение: 
  //

  Процедура СобытиеОбработано(Объект, РезультатОбработки) Экспорт


Функции, обязательные для модулей обработок обслуживания эквайринговых систем

Данные функции являются обязательными только для модулей обработок обслуживания эквайринговых систем. При создании обработок обслуживания оборудования другого вида на основе содержащегося в данном разделе шаблона эти функции необходимо удалить из обработки обслуживания.

Функция "ОплатитьПлатежнойКартой"

 


// Функция осуществляет авторизацию (оплату) по карте.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера ЭС.
  //
  // Сумма - <Число>
  // - Сумма к оплате по карте
  //
  // КодRRN - <Строка>
  // - Уникальный код RRN транзакции
  //
  // КодАвторизации - <Строка>
  // - Возвращается код авторизации транзакции
  //
  // КодОперации - <Строка>
  // - Последовательный код операции
  //
  // МассивСтрокСлипЧека - <Структура>
  // - Массив строк слип-чека, сформированного
  // после успешного выполнения операции
  //
  // ШиринаЧека - <Число>
  // - Ширина слип-чека, установленная в параметрах настройки
  //
  // КоличествоКопий - <Число>
  // - Количество печатаемых копий слип-чека
  // 
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ОплатитьПлатежнойКартой(Объект, Сумма, КодRRN, 
  КодАвторизации, КодОперации, 
  МассивСтрокСлипЧека, ШиринаЧека, КоличествоКопий) Экспорт



Функция "ВернутьПлатежПоПлатежнойКарте"

 


// Функция осуществляет возврат платежа по карте.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера ЭС.
  //
  // Сумма - <Число>
  // - Сумма к оплате по карте
  //
  // КодRRN - <Строка>
  // - Уникальный код RRN транзакции
  //
  // КодАвторизации - <Строка>
  // - Возвращается код авторизации транзакции
  //
  // КодОперации - <Строка>
  // - Последовательный код операции
  //
  // МассивСтрокСлипЧека - <Структура>
  // - Массив строк слип-чека, сформированного
  // после успешного выполнения операции
  //
  // ШиринаЧека - <Число>
  // - Ширина слип-чека, установленная в параметрах настройки
  //
  // КоличествоКопий - <Число>
  // - Количество печатаемых копий слип-чека
  // 
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ВернутьПлатежПоПлатежнойКарте(Объект, Сумма, КодRRN,
  КодАвторизации, КодОперации,
  МассивСтрокСлипЧека, ШиринаЧека, КоличествоКопий) Экспорт


Функция "ОтменитьПлатежПоПлатежнойКарте"

 


// Функция осуществляет отмену платежа по карте.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера ЭС.
  //
  // Сумма - <Число>
  // - Сумма к оплате по карте
  //
  // КодRRN - <Строка>
  // - Уникальный код RRN транзакции
  //
  // КодАвторизации - <Строка>
  // - Возвращается код авторизации транзакции
  //
  // КодОперации - <Строка>
  // - Последовательный код операции
  //
  // МассивСтрокСлипЧека - <Структура>
  // - Массив строк слип-чека, сформированного
  // после успешного выполнения операции
  //
  // ШиринаЧека - <Число>
  // - Ширина слип-чека, установленная в параметрах настройки
  //
  // КоличествоКопий - <Число>
  // - Количество печатаемых копий слип-чека
  // 
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ОтменитьПлатежПоПлатежнойКарте(Объект, Сумма, КодRRN,
  КодАвторизации, КодОперации,
  МассивСтрокСлипЧека, ШиринаЧека, КоличествоКопий) Экспорт


Функция "ИтогиДняПоКартам"

 


// Функция осуществляет сверку итогов по картам.
  // (API v2.0)
  //
  // Параметры: 
  // Объект - <*>
  // - Объект драйвера ЭС.
  //
  // МассивСтрокСлипЧека - <Структура>
  // - Массив строк слип-чека, сформированного
  // после успешного выполнения операции
  //
  // ШиринаЧека - <Число>
  // - Ширина слип-чека, установленная в параметрах настройки
  //
  // Возвращаемое значение: 
  // <ПеречислениеСсылка.ОшибкиПриРаботеСТорговымОборудованием>
  // - Результат работы функции.
  //

  Функция ИтогиДняПоКартам(Объект, МассивСтрокСлипЧека, ШиринаЧека) Экспорт


Функция "ПоддерживаетсяСверкаИтогов"

 


// Проверяется возможность выполнения операции "Сверка итогов"
  // (API v2.0)
  //
  // Параметры:
  //
  // Возвращаемое значение:
  // <Булево> - Признак поддержки операции "сверка итогов".
  //

  Функция ПоддерживаетсяСверкаИтогов() Экспорт

andreykyiv@bigmir.net, gospodin_h,
17.02.09, 15:28 Направление текста в таблице
[attachment=91:То_е_ный_рисунок.bmp]
Это имели ввиду? Если да, то свойства ячейки - ориентация. Указываем градус (число), на который нужно повернуть надпись
Vofka,
17.02.09, 12:50 Аналог функции ГрупповаяОбработка() 7.7
Ну я так и думал, но похоже нашел выход (по крайней мере мне мне именно это и нужно)
В момент проведения можно проверить открыта ли форма проводимого документа
и если открыта то выводить нужную мне информацию


// в обработке проведения
Если ЭтотОбъект.ПолучитьФорму().Открыта() Тогда
Сообщить("Нужная мне информация");
КонецЕсли;
liksoft,
16.02.09, 12:09 Ввод остатков в 7.70.015
Посмотрите документ "Ввод остатков по кредиту"
Nicolle,
12.02.09, 10:14 Замедление производительности клиент-сервеного варианта
Данную тему я поднимал на другом форуме, но т.к. являюсь её автором и нашел выход из сложившейся ситуации, то позволю себе разместить здесь

ОПИСАНИЕ ПРОБЛЕМЫ

УТ 2.3.2.6 для Украины, но и в российской версии так же присутствует проблемный запрос.
Платформа 8.1.12.101, MS SQL Server 2005, Windows Server 2003 R2 Enterprise x64 Edition SP2
Компьютер: Intel® Xeon® CPU E5430 @ 2.66GHz, 7.99GB ОЗУ
Рекомендации по регламентным операциям для MS SQL Server выполнены: 
• Обновление статистик 
• Очистка процедурного КЭШа
• Дефрагментация индексов
• Реиндексация таблиц базы данных

В параметрах учетной политики стоит флаг "Списывать партии при проведении документов".
Снятие его решает проблему медленного проведения документа, но не решает проблемы медленного восстановления последовательности по партиям.  
Регистры накопления рассчитаны на 31.12.2008 
Проводится документ перемещения товаров от 01.10.2007 . Количество строк 546.  
Замер производительности показал, что проведение в клиент-серверном варианте 
в 2,67!!! раз выполняется дольше, чем в файловом.

Файловый вариант:
ОбщийМодуль.ОбщегоНазначения СтрокаДвижения.НаборЗаписей.Записать(); - 31,542450 сек
ОбщийМодуль.УправлениеЗапасамиПартионныйУчет Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) - 30,270411 сек

Клиент - серверный вариант:
ОбщийМодуль.ОбщегоНазначения СтрокаДвижения.НаборЗаписей.Записать(); - 5,217208 сек ОбщийМодуль.УправлениеЗапасамиПартионныйУчет Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); - 160,466609 сек

Исследование проведения документа в парсере SQL показали что бульшую часть времени уходит на выполнение запроса, сформированного в 1С. Формируется этото запрос в процедуре ЗаполнитьЗапросПартийНаСкладахУпр общего модуля УправлениеЗапасамиПартионныйУчет.

там есть участок:


|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
| &Дат,
| Номенклатура В
| (ВЫБРАТЬ
| РегистрСведений.СписанныеТовары.Номенклатура
| ИЗ
| РегистрСведений.СписанныеТовары
| ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)"
+ ?(ВестиПартионныйУчетПоСкладам, "
| И (Склад В 
| (ВЫБРАТЬ
| РегистрСведений.СписанныеТовары.Склад
| ИЗ
| РегистрСведений.СписанныеТовары
| ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
| ИЛИ Склад = &ПустойСклад)", "") + ") КАК ПартииТоваровНаСкладах


проанализровав который, сдел вывод, что для каждой строки партии выполняется запрос для получения списка номенклатуры из регистра сведений СписанныеТовары. А теперь представим что строк в документе более 500 и регистр Списанныетовары сам по себе огромный, то колличество таких внутренних "одних и тех же" запросов прямопропорцинально количеству строк в документе регистраторе. Вобщем SQL-ю стало плохо о такого условия с выборкой. 

Что сделал я. Сначала с помощью вложенных запросов получил списки необходимой номенклатуры и складов, а потом поставил в условие проверку вхождения номенклатуры и складов в полученные с помощью вложенных запросов списки. 
Таким образом запрос по регистру сведений СписанныТовары выполняется один раз, а номенклатура и склад проверяются на вхождение в уже сформированные списки. 
Результаты замера производительности просто потрясли: теперь 


Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)
выполняется меньше чем за 10 секунд против 160 в типовом запросе.




Ответ 1С по поводу такого поведения платформы:
Спасибо за сообщение. Информация передана в отдел разработки. 
Зарегистрирована ошибка 10009845


ПРЕДПОЛАГАЕМЫЙ ДИАГНОЗ
Скорее всего конструкции вида :



| Номенклатура В
| (ВЫБРАТЬ
| РегистрСведений.СписанныеТовары.Номенклатура
| ИЗ
| РегистрСведений.СписанныеТовары
| ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)" 


представляют проблему для оптимизатора MS SQL 2005.



ИСПРАВЛЕНИЕ ЗАПРОСА (ВРЕМЕННАЯ ЗАПЛАТКА, ПОКА ОШИБКА НЕ ИСПРАВЛЕНА)



Вот код измененной процедуры:

Процедура ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам,
СтратегияСтатусПартии, СпособОценкиМПЗ)
   
Запрос.Текст ="
   
|ВЫБРАТЬ
| СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
| ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
| ПартииТоваровНаСкладах.Склад,
| ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
| ПартииТоваровНаСкладах.СерияНоменклатуры,
| ПартииТоваровНаСкладах.Качество,
| ПартииТоваровНаСкладах.Заказ,
| ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
| ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
| ПартииТоваровНаСкладах.СтатусПартии,
| ВЫБОР
| КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ЧислоСерияНоменклатуры,
| ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ КАК ЧислоДокументОприходования,
| ВЫБОР
| КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК ЧислоЗаказ,
| ВЫБОР
| КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ЧислоСтатусПартии
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дат, ) КАК ПартииТоваровНаСкладах
| ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
| И (ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
| ТОГДА ИСТИНА
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.Качество = &ПустоеКачество
| ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
| ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
| КОНЕЦ
| КОНЕЦ)
| И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад
| ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)
| И (ВЫБОР
| КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
| ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
| ИНАЧЕ ИСТИНА
| КОНЕЦ)
| И (ВЫБОР
| КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
| ТОГДА ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ВЫБОР
| КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
| ТОГДА ЛОЖЬ
| ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| КОНЕЦ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| КОНЕЦ)
| И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
| ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование),
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| СписанныеТовары.Номенклатура КАК Номенклатура
| ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ГДЕ
| СписанныеТовары.Регистратор = &Ссылка) КАК СписокТоваров,
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| СписанныеТовары.Склад КАК Склад
| ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ГДЕ
| СписанныеТовары.Регистратор = &Ссылка) КАК СписокСкладов
|ГДЕ
| СписанныеТовары.Регистратор = &ОсновнойДокумент
| И ПартииТоваровНаСкладах.Номенклатура В (СписокТоваров.Номенклатура)"
+?(ВестиПартионныйУчетПоСкладам, "
| И (ПартииТоваровНаСкладах.Склад В (СписокСкладов.Склад)
| ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)","")+"
|
|УПОРЯДОЧИТЬ ПО
| ЧислоСерияНоменклатуры,
| ЧислоДокументОприходования,
| ЧислоЗаказ,
| ЧислоСтатусПартии" +
?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобств
енные, " Убыв", "") + ",
| ДокументОприходованияДата" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
| ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + "
|ИТОГИ ПО
| НомерСтрокиДокумента  
|";  

КонецПроцедуры // ЗаполнитьЗапросПартийНаСкладахУпр()




Тестирование на типовой конигурации: выполнил полное перепроведение документов в типовой до изменения и полное перепроведение после изменения. Отчеты по партиям, по остаткам до и после СОВПАЛИ.

Рекомендуется при исправлении запроса использовать не вложенные запросы, а временную таблицу (в пакете). Сильная вложенность тоже иногда даёт непредсказуемые результаты, особенно если регламентные процедуры на сервере не проводятся.

Но на использование временных таблиц я запрос не переделывал
MATEVI, vbi,
11.02.09, 22:37 Разделение диаграмм Ганта на порции
Иногда может возникнуть необходимость разделения диаграммы Ганта на порции. Например, это может оказаться полезным для подготовки диаграммы для печати. В диаграмме содержится слишком много данных и она отображается с вертикальной и/или горизонтальной прокруткой. Если такую диаграмму вывести на печать напрямую, будет отображена только первая "порция" данных.

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

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

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

Ниже приведен пример подобного алгоритма. Следует обратить внимание на несколько моментов.
Определение количества строк, которые можно вывести в одной порции. В данном примере подразумевается, что мы знаем используемый шрифт диаграммы, знаем высоту порции, поскольку она берется из макета, и можем заранее определить (подобрать) количество строк как константу. При необходимости можно написать более "интеллектуальный" код, который будет динамически расчитывать это число.

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

Данный пример оформлен как модуль обработки. Нужно заполнить экспортируемую переменную ИсходнаяДГ и вызвать функцию ПодготовитьПечатьДиаграммыГанта().





Перем ИсходнаяДГ Экспорт; // Исходная диаграмма Ганта.
Перем Макет; // Макет, используемый для формирования.
Перем РазмерПорцииСтрок; // Количество отображаемых строк.
Перем ВыводимыйДокумент; // Формируемый табличный документ.
Перем ТекущееКоличествоСтрок; // Количество выведенных строк в текущую диаграмму.
Перем ТекущаяДиаграмма; // Текущая заполняемая диаграмма.
Перем ТекущаяСерия; // Серия заполняемой диаграммы.
Перем ТекущаяКолекцияТочек; // Текущая колекция точек заполняемой диаграммы.
Перем ПерваяСтраница; // Флаг первой выводимой страницы.

Процедура ПодготовитьПечатьДиаграммыГанта() Экспорт
Макет = ПолучитьМакет("Макет");
ВыводимыйДокумент = Новый ТабличныйДокумент;
РазмерПорцииСтрок = ВычислитьКоличествоОтображаемыхСтрок();
ПерваяСтраница = Истина;
Если ИсходнаяДГ.Точки.Количество() > 0 Тогда
ПерваяТочка = ИсходнаяДГ.Точки[0];
КонецЕсли;
НоваяДиаграмма(ПерваяТочка);
ВывестиТочки(ИсходнаяДГ.Точки);
Для Каждого Рисунок Из ВыводимыйДокумент.Рисунки Цикл
Рисунок.Объект.ПоказатьУровеньТочек(0);
КонецЦикла;
ВыводимыйДокумент.Показать();
КонецПроцедуры

Функция ВычислитьКоличествоОтображаемыхСтрок()
Возврат 21; // Заранее подобранная константа.
КонецФункции

Процедура НоваяДиаграмма(СледующаяТочка)
Если ПерваяСтраница Тогда
ПерваяСтраница = Ложь;
Иначе
ВыводимыйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Область = Макет.ПолучитьОбласть("ОбластьДиаграммы");
ВыводимыйДокумент.Вывести(Область);
ТекущаяДиаграмма = ВыводимыйДокумент.Рисунки[ВыводимыйДокумент.Рисунки.Количество() - 1].Объект;
ТекущаяДиаграмма.АвтоОпределениеПолногоИнтервала = Ложь;
ТекущаяДиаграмма.УстановитьПолныйИнтервал(ИсходнаяДГ.НачалоПолногоИнтервала,
ИсходнаяДГ.КонецПолногоИнтервала);
ИсходнаяШкала = ИсходнаяДГ.ОбластьПостроения.ШкалаВремени;
ТекущаяШкала = ТекущаяДиаграмма.ОбластьПостроения.ШкалаВремени;
ТекущаяШкала.Положение = ИсходнаяШкала.Положение;
ТекущаяШкала.ПрозрачныйФон = ИсходнаяШкала.ПрозрачныйФон;
ТекущаяШкала.ЦветТекста = ИсходнаяШкала.ЦветТекста;
ТекущаяШкала.ЦветФона = ИсходнаяШкала.ЦветФона;
Для Индекс = 0 По ИсходнаяШкала.Элементы.Количество() - 1 Цикл
ИсходныйЭлемент = ИсходнаяШкала.Элементы[Индекс];
Если Индекс = 0 Тогда
ТекущийЭлемент = ТекущаяШкала.Элементы[0];
Иначе
ТекущийЭлемент = ТекущаяШкала.Элементы.Добавить();
КонецЕсли;
ТекущийЭлемент.Видимость = ИсходныйЭлемент.Видимость;
ТекущийЭлемент.Единица = ИсходныйЭлемент.Единица;
ТекущийЭлемент.Кратность = ИсходныйЭлемент.Кратность;
ТекущийЭлемент.ЛинииДелений = ИсходныйЭлемент.ЛинииДелений;
ТекущийЭлемент.ОтображатьПериодическиеМетки = ИсходныйЭлемент.ОтображатьПериодическиеМетки;
ТекущийЭлемент.Формат = ИсходныйЭлемент.Формат;
ТекущийЭлемент.ФорматДня = ИсходныйЭлемент.ФорматДня;
ТекущийЭлемент.ЦветЛиний = ИсходныйЭлемент.ЦветЛиний;
ТекущийЭлемент.ЦветТекста = ИсходныйЭлемент.ЦветТекста;
ТекущийЭлемент.ЦветФона = ИсходныйЭлемент.ЦветФона;
КонецЦикла;
ТекущееКоличествоСтрок = 0;
ТекущаяСерия = ТекущаяДиаграмма.Серии.Добавить();
ИсходнаяСерия = ИсходнаяДГ.Серии[0];
ТекущаяСерия.ДополнительныйЦвет = ИсходнаяСерия.ДополнительныйЦвет;
ТекущаяСерия.ПриоритетЦвета = ИсходнаяСерия.ПриоритетЦвета;
ТекущаяСерия.Расшифровка = ИсходнаяСерия.Расшифровка;
ТекущаяСерия.Текст = ИсходнаяСерия.Текст;
ТекущаяСерия.Значение = ИсходнаяСерия.Значение;
ТекущаяСерия.Цвет = ИсходнаяСерия.Цвет;
ТекущаяСерия.ЦветШтриховкиМеждуИнтервалами = ИсходнаяСерия.ЦветШтриховкиМеждуИнтервалами;
ТекущаяСерия.ШтриховкаМеждуИнтервалами = ИсходнаяСерия.ШтриховкаМеждуИнтервалами;
ТекущаяСерия.ШтриховкаПерекрывающихсяИнтервалов = ИсходнаяСерия.ШтриховкаПерекрывающихсяИнтервалов;
ТекущаяКолекцияТочек = ТекущаяДиаграмма.Точки;
Если СледующаяТочка <> Неопределено Тогда
Родители = Новый Массив;
Родитель = СледующаяТочка;
Пока Родитель.Родитель <> Неопределено Цикл
Родитель = Родитель.Родитель;
Родители.Добавить(Родитель);
КонецЦикла;
Для Индекс = 1 По Родители.Количество() Цикл
ИсходныйРодитель = Родители[Родители.Количество() - Индекс];
ТекущийРодитель = ТекущаяКолекцияТочек.Добавить();
ТочкаВТочку(ИсходныйРодитель, ТекущийРодитель);
ТекущаяКолекцияТочек = ТекущийРодитель.Точки;
ТекущееКоличествоСтрок = ТекущееКоличествоСтрок + 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Процедура ТочкаВТочку(ИсходнаяТочка, КонечнаяТочка)
КонечнаяТочка.ДополнительныйЦвет = ИсходнаяТочка.ДополнительныйЦвет;
КонечнаяТочка.Значение = ИсходнаяТочка.Значение;
КонечнаяТочка.Картинка = ИсходнаяТочка.Картинка;
КонечнаяТочка.ПриоритетЦвета = ИсходнаяТочка.ПриоритетЦвета;
КонечнаяТочка.Расшифровка = ИсходнаяТочка.Расшифровка;
КонечнаяТочка.Текст = ИсходнаяТочка.Текст;
КонечнаяТочка.Цвет = ИсходнаяТочка.Цвет;
КонечнаяТочка.ЦветТекста = ИсходнаяТочка.ЦветТекста;
КонечнаяТочка.ЦветФона = ИсходнаяТочка.ЦветФона;
КонечнаяТочка.Шрифт = ИсходнаяТочка.Шрифт;
ИсходноеЗначение = ИсходнаяДГ.ПолучитьЗначение(ИсходнаяТочка, ИсходнаяДГ.Серии[0]);
КонечноеЗначение = ТекущаяДиаграмма.ПолучитьЗначение(КонечнаяТочка, ТекущаяСерия);
КонечноеЗначение.ДополнительныйЦвет = ИсходноеЗначение.ДополнительныйЦвет;
КонечноеЗначение.Расшифровка = ИсходноеЗначение.Расшифровка;
КонечноеЗначение.Текст = ИсходноеЗначение.Текст;
КонечноеЗначение.Цвет = ИсходноеЗначение.Цвет;
КонечноеЗначение.ЦветТекста = ИсходноеЗначение.ЦветТекста;
КонечноеЗначение.ЦветФона = ИсходноеЗначение.ЦветФона;
Для Каждого ИсходныйИнтервал Из ИсходноеЗначение Цикл
КонечныйИнтервал = КонечноеЗначение.Добавить();
КонечныйИнтервал.Конец = ИсходныйИнтервал.Конец;
КонечныйИнтервал.Начало = ИсходныйИнтервал.Начало;
КонечныйИнтервал.Расшифровка = ИсходныйИнтервал.Расшифровка;
КонечныйИнтервал.Текст = ИсходныйИнтервал.Текст;
КонечныйИнтервал.Цвет = ИсходныйИнтервал.Цвет;
КонецЦикла;
КонецПроцедуры

Процедура ВывестиТочки(ИсходныеТочки)
Для Каждого Точка Из ИсходныеТочки Цикл
Если ТекущееКоличествоСтрок >= РазмерПорцииСтрок Тогда
НоваяДиаграмма(Точка);
КонецЕсли;
НоваяТочка = ТекущаяКолекцияТочек.Добавить();
ТекущееКоличествоСтрок = ТекущееКоличествоСтрок + 1;
ТочкаВТочку(Точка, НоваяТочка);
Если Точка.Точки.Количество() > 0 Тогда
ТекущаяКолекцияТочек = НоваяТочка.Точки;
ВывестиТочки(Точка.Точки);
Если ТекущаяКолекцияТочек.Родитель.Родитель <> Неопределено Тогда
ТекущаяКолекцияТочек = ТекущаяКолекцияТочек.Родитель.Родитель.Точки;
Иначе
ТекущаяКолекцияТочек = ТекущаяДиаграмма.Точки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
AnryMc, atugan,
11.02.09, 22:35 Особенности работы с объектной моделью HTML документа
Объектная модель документа (DOM) позволяет работать с HTML документом, как с деревом элементов. С помощью объектной модели разработчик может найти нужный ему HTML документ, может обращаться к его свойствам, в том числе вносить в документ изменения.

Важно помнить, что, при изменении документа (программном изменении, либо при навигации поля HTML документа) объекты HTML документа перестраиваются не моментально. В течении некоторого времени объектная модель документа не готова к использованию. Поэтому при разработке алгоритма, модифицирующего HTML документ, следует дождаться готовности HTML документа.

Для получения информации о готовности HTML документа к работе рекомендуется использовать обработчик события ДокументСформирован поля HTML-документа. При этом нужно помнить о следующей особенности: в момент окончания формирования документа, сообщение о событии помещается в очередь, но, до того как оно будет обработано, может произойти новое изменение HTML документа. Например, первый вызов данного события в форме обычно информирует о внутренней навигации поля HTML-документа. Поэтому в обработчике события ДокументСформирован рекомендуется также анализировать значение свойства readyState HTML-документа.
Значение этого свойства показывает текущий этап формирования HTML документа. В случае, когда значение равно Complete, формирование объектной модели завершено, документ готов к работе.

Не следует анализировать готовность HTML документа вне обработчика события ДокументСформирован путем циклического опроса значения свойства readyState:


Пока ЭлементыФормы.ПолеHTMLДокумента.Документ.readyState <> "complete" Цикл

КонецЦикла;

Такой цикл может работать бесконечно, т.к. формирование HTML документа использует в своей работе синхронный обмен сообщениями через системную очередь сообщений, а обработки нового сообщения, в данном случае, не происходит.
Vlad 1C,
11.02.09, 22:32 Особенности редактирования значений произвольного типа в табличном поле
В некоторых случаях требуется организовать ввод данных произвольного типа в колонки табличного поля. Причем тип данных, которые будут вводиться в колонку табличного поля, заранее неизвестен. Например, пусть необходимо создать форму подбора, позволяющую выбирать значения произвольного типа. Причем тип выбираемого значения заранее неизвестен и выбирается из заранее сформированного списка доступных типов. Выбранные значения необходимо поместить в таблицу значений. Для решения данной задачи необходимо уметь выбирать тип из списка доступных типов и на основании выбранного типа динамически изменять тип редактируемого значения в элементе управления, расположенном в колонке табличного поля, отображающей выбранное значение. Особенность элементов управления, расположенных в колонках табличного поля, состоит в том, что тип редактируемого значения можно изменять только для колонок табличного поля, не связанных с данными. Поэтому реализация данной задачи имеет некоторые особенности.

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

Для реализации данной задачи, прежде всего, необходимо сформировать массив доступных типов. Для этого в модуле формы создается массив доступных типов, в который помещаются необходимые типы. В нашем случае это Число, Строка, Дата, Булево и ссылки на справочники и документы. На основании сформированного массива в элементе управления колонки Тип табличного поля Список формируется список значений, содержащий индексы типов в массиве доступных типов. Также в таблицу значений добавляется специальная колонка - Значение, в которой будет храниться значение выбранного типа.



// Заполняем массив доступных типов. Из этого массива будет выбираться тип редактируемого значения.
МассивДоступныхТипов = Новый Массив;
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Булево")));

// Добавляем ссылки на справочники
Для Каждого ЭлементТипа Из Справочники.ТипВсеСсылки().Типы() Цикл

МассивДоступныхТипов.Добавить(ЭлементТипа);

КонецЦикла;

// Добавляем ссылки на документы
Для Каждого ЭлементТипа Из Документы.ТипВсеСсылки().Типы() Цикл

МассивДоступныхТипов.Добавить(ЭлементТипа);

КонецЦикла;

// На основании массива доступных типов формируем список значений для поля ввода в колонке, отображающей тип.
// Значением является индекс типа в массиве доступных типов, а представлением - представление типа
Для ИндексЭлемента = 0 по МассивДоступныхТипов.Количество() - 1 Цикл

ЭлементыФормы.Список.Колонки.Тип.ЭлементУправления.СписокВыбора.Добавить(ИндексЭ
лемента, МассивДоступныхТипов[ИндексЭлемента]);

КонецЦикла;

// В таблицу значений (Список) добавляем колонку для хранения значения выбранного типа.
Список.Колонки.Добавить("Значение");


В обработчике события ПриИзменении элемента управления, расположенного в колонке Тип делается установка выбранного типа в элемент управления (в нашем случае это поле ввода) в колонке Значение.



Процедура СписокТипПриИзменении(Элемент)

// Устанавливаем выбранный тип в поле ввода в колонке "Значение"
МассивТипов = Новый Массив;
МассивТипов.Добавить(МассивДоступныхТипов[Элемент.Значение]);
ЭлементыФормы.Список.Колонки.Значение.ЭлементУправления.ТипЗначения = Новый ОписаниеТипов(МассивТипов);

КонецПроцедуры


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



Процедура СписокЗначениеПриИзменении(Элемент)

// Сохраняем выбранное значение в таблице значений
ЭлементыФормы.Список.ТекущиеДанные.Значение = Элемент.Значение;

КонецПроцедуры


Наконец для того, чтобы выбранные значения корректно отображались в табличном поле необходимо использовать обработчик события ПриВыводеСтроки, в котором текст для выбранного типа и значения.



Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

ОформлениеСтроки.Ячейки.Тип.УстановитьТекст(МассивДоступныхТипов[ДанныеСтроки.Ти
п]);
ОформлениеСтроки.Ячейки.Значение.УстановитьТекст(ДанныеСтроки.Значение);

КонецПроцедуры
DiegoLidabo,
11.02.09, 22:09 Использование режима "ввод по строке" для поля ввода типа строка
Использование режима "ввод по строке" может быть запрограммировано произвольным образом не только для реквизитов ссылочных типов (Справочник, Документ, План видов характеристик, План счетов, План видов расчета, Перечисление), но и для реквизитов типа "Строка". Написание программного кода осуществляется в обработчиках поля ввода АвтоПодборТекста() и ОкончаниеВводаТекста(). Например, по набору первых символов в поле ввода колонки табличного поля системой может быть автоматически предложено дополнение вводимого текста до уже существующего в этой колонке значения. При окончании ввода текста (нажатию Enter или сходе с элемента управления), системой может быть предложен список с найденными, по первым введенным символам, значениям колонки.

Пример программного управления режимом "ввод по строке" для поля ввода типа строка, продемонстрирован во внешней обработке.
После запуска обработки добавьте строку в таблицу значений. В колонке "Цвет" введите первые символы названия цвета, после чего будет предложено дополнение вводимого текста.
balogo, MsDjuice,

22 страниц V  « < 18 19 20 21 22 >
RSS Текстовая версия Сейчас: 23.04.24, 21:31
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!