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

Хранилище

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

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



История благодарностей участнику Vofka ::: Спасибо сказали: 4519 раз
Дата поста: В теме: За сообщение: Спасибо сказали:
28.02.11, 10:07 Управление флажком в строке дерева значений для управляемой формы 8.2
[attachment=294:DerevoSFlagkami.PNG]

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

Прилагаемая внешняя обработка ДеревоСФлажками.epf содержит в модуле формы код управления флажком с тремя состояниями. Реализована наиболее "естественная" логика управления флажками:

- если устанавливается флажок родительской строки, то устанавливаются флажки всех строк - потомков этой строки;

- если сбрасывается флажок родительской строки, то сбрасываются флажки всех строк - потомков этой строки;

- если установлены флажки всех потомков строки, то устанавливается также флажок этой родительской строки;

- если сброшены флажки всех потомков строки, то сбрасывается также флажок этой родительской строки;

- если флажки строк-потомков установлены частично, то флажок родительской строки становится "серым".

Остается напомнить, что тип реквизита, отображаемого флажком с тремя состояниями - Число, и значения его таковы: 0 - флажок сброшен, 1 - флажок установлен, 2 - флажок "серый".

Автор: Николай Больсунов
bernc,
28.02.11, 10:06 Обработчик проверки заполнения
1С Предприятие 8.2. Обработчик проверки заполнения

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 
КонецПроцедуры


Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

  Клиент = ПроверяемыеРеквизиты.Найти("Контрагент");

  Если Клиент<>Неопределено тогда

   ПроверяемыеРеквизиты.Удалить(Клиент);

  конецесли;

  ПроверяемыеРеквизиты.Добавить("Склад");

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


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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

ПроверяемыеРеквизиты.Очистить();

Если Контрагент.ПометкаУдаления Тогда

  Отказ = Истина;

  Сообщение = Новый СообщениеПользователю;

  Сообщение.Текст = "Нельзя указывать контрагента, помеченного на удаление!";

  Сообщение.Поле = "Контрагент";

  Сообщение.УстановитьДанные(ЭтотОбъект);

  Сообщение.Сообщить();


КонецЕсли;

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


Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение - при проведении, иначе при записи; для обработки : при вызове стандартных команд "OK", Да". Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:

&НаКлиенте

Процедура Проверить(Команда)

  ПроверитьНаСервере();

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



&НаСервере

Процедура ПроверитьНаСервере()

  Документ = РеквизитФормыВЗначение("Объект");

  Документ.ПроверитьЗаполнение();

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


Автор: Борис Захаров
mister-x,
28.02.11, 9:30 Реализация подбора в управляемых формах
Реализация формы подбора в 1С 8.2

В данной статье рассматривается технология реализации подбора на платформе 1С 8.2. Статья не претендует на истину в последней инстанции, просто столкнувшись с рядом проблем и не нашедшим «правильной» методологии решения (возможно плохо искал), решил пройти этот путь самостоятельно, естественно пользуясь различными источниками. В основном я опираюсь на материалы мастер-групп Базового курса «Профессиональное программирование в 1С» Евгения Гилева и Насипова Фарита, участником которого я являюсь, а также соответствующей литературы (М.Г. Радченко, Е.Ю. Хрусталева Практическое пособие разработчика).

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

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

Склад - тип СправочникиСсылка.Склады

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

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

Настраиваем запрос для реквизита Товары. Здесь по идее все просто с помощью конструктора берем два справочника и виртуальную таблицу Остатков регистра Остатки товара. Если нужно видеть весь товар, то используем левое соединение Товаров с остальными источниками, если только с остатками, то полное соединение с регистром:

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


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

В книге «Разработка управляемого интерфейса» мне не удалось найти описание этой ситуации. Сразу хочу отметить, что в типовой конфигурации управление небольшой фирмой используется не динамический список, а дерево значений.

И так, возвращаемся в нормальное русло решение задачи.

В разработанной форме я добавил параметр Склад с целью отбора остатков.

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

&НаКлиенте
Процедура Подбор(Команда)
ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, МножественныйВыбор,Склад", Ложь, Истина, Объект.Склад);
ОткрытьФорму("Документ.ПродажаТоваров.Форма.ФормаПодбора", ПараметрыПодбора, Элементы.Товары);
КонецПроцедуры


Соответственно в форме подбора при создании заполняем параметр запроса склад из параметров формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Товары.Параметры.УстановитьЗначениеПараметра("Склад",Параметры.Склад);
Склад = Параметры.Склад;
КонецПроцедуры


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

&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Для каждого НомерСтроки Из ВыбраннаяСтрока Цикл
ТекСтрока = Элемент.ДанныеСтроки(НомерСтроки);
Поиск = Новый Структура("Товар, Серия",ТекСтрока.Товар,ТекСтрока.Серия);
МассивСтрок = ВыбранныеТовары.НайтиСтроки(Поиск);
Если МассивСтрок.Количество() = 0 Тогда
Строка = ВыбранныеТовары.Добавить();
Строка.Товар = ТекСтрока.Товар;
Строка.Серия = ТекСтрока.Серия;
Строка.СрокГодности = ТекСтрока.СрокГодности;
Строка.Количество = 1;
ВвестиЧисло(Строка.Количество, "Введите количество");
Пока  Строка.Количество > ТекСтрока.Количество Цикл
ВвестиЧисло(Строка.Количество, "Введите верное количество!");
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры


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

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

Так же необходимо создать обработчик события Перетаскивание для элемента формы ВыбранныеТовары.

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


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

На рисунке приведен внешний вид формы подбора:

[attachment=293:FormPodbora.png]

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

&НаКлиенте
Процедура Перенести(Команда)
ОповеститьОВыборе(ВыбранныеТовары);
Закрыть();
КонецПроцедуры


Соответственно, в форме документа реализован обработчик события ОбработкаВыбора:

&НаКлиенте
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ВыбранноеЗначение.Количество() > 0 И Объект.Товары.Количество() > 0 Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Текст = "Очистить табличную часть?";
Ответ = Вопрос(Текст, Режим, 0);    
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
КонецЕсли;
КонецЕсли;
Для каждого Подбор Из ВыбранноеЗначение Цикл
Строка = Объект.Товары.Добавить();
Строка.Товар = Подбор.Товар;
Строка.Серия = Подбор.Серия;
Строка.Количество = Подбор.Количество;
КонецЦикла;


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

Автор: Юрий Комиссаров
mister-x,
28.02.11, 9:27 Новая методика контроля отрицательных остатков при проведении документов в системе 1С:Предприятие 8.2
Новая методика контроля отрицательных остатков при проведении документов в системе 1С:Предприятие 8.2.

За последние полгода меня уже серьезно достали! Достали тем, что просят рассказать о новом контроле остатков. Причем все вроде как слышали «там сначала списываем, а потом проверяем, не ушли ли в минус?». И почему-то новая методика всеми считается панацеей.

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

Вводная ситуация.

Имеем конфигурацию с одним регистром накопления «ОстаткиТоваров», регистр имеет 2 измерения: «Номенклатура» и «Склад» и один ресурс «Количество». По регистру движения формируют 2 документа: «Приходная» и «Расходная». Справочники, реквизиты документов и типы данных надеюсь очевидны.

Про «Приходную» писать нечего, там просто формируются в «плюс» остатки. Про «Расходную поговорим подробнее. Для начала вспомним, как формировалась процедура проведения в 8.1.

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

|     РасходнаяТовары.Номенклатура,

|     СУММА(РасходнаяТовары.Количество) КАК Количество

|ПОМЕСТИТЬ ДокТЧ

|ИЗ

|     Документ.Расходная.Товары КАК РасходнаяТовары

|ГДЕ

|     РасходнаяТовары.Ссылка = &Ссылка

|

|СГРУППИРОВАТЬ ПО

|     РасходнаяТовары.Номенклатура

|;

|

|////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ

|     ДокТЧ.Номенклатура,

|     ДокТЧ.Количество,

|     ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) КАК Остаток

|ИЗ

|     ДокТЧ КАК ДокТЧ

|           ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(

|                       ,

|                       Склад = &Склад

|                            И Номенклатура В

|                                  (ВЫБРАТЬ

|                                        ДокТЧ.Номенклатура

|                                  ИЗ

|                                        ДокТЧ КАК ДокТЧ)) КАК ОстаткиТоваровОстатки

|           ПО ДокТЧ.Номенклатура = ОстаткиТоваровОстатки.Номенклатура";

Запрос.УстановитьПараметр("Склад", Склад);

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();


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

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

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

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

      Если Выборка.Количество < Выборка.Остаток Тогда

            Сообщить("Не хватает товара " + Выборка.Номенклатура + ", из необходимых " + Выборка.Количество + " в наличие имеется только " + Выборка.Остаток;

            Отказ = Истина;

      КонецЕсли;



      Если Не Отказ Тогда

            Движение = Движения.ОстаткиТоваров.Добавить();

            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

            Движение.Период = Дата;

            Движение.Номенклатура = Выборка.Номенклатура;

            Движение.Склад = Склад;

            Движение.Количество = Выборка.Количество;

КонецЕсли;

КонецЦикла;


Вроде бы, куда уж проще и быстрее? Однако есть куда!

Разберем новую методику контроля остатоков.

Для начала получим сгруппированную табличную часть документа.

     Запрос = Новый Запрос;

      Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

      Запрос.Текст = "ВЫБРАТЬ

      |     РасходнаяТовары.Номенклатура,

      |     СУММА(РасходнаяТовары.Количество) КАК Количество

      |ПОМЕСТИТЬ ДокТЧ

      |ИЗ

      |     Документ.Расходная.Товары КАК РасходнаяТовары

      |ГДЕ

      |     РасходнаяТовары.Ссылка = &Ссылка

      |

      |СГРУППИРОВАТЬ ПО

      |     РасходнаяТовары.Номенклатура

      |;

      |

      |////////////////////////////////////////////////////////////////////////////////

      |ВЫБРАТЬ

      |     ДокТЧ.Номенклатура,

      |     ДокТЧ.Количество

      |ИЗ

      |     ДокТЧ КАК ДокТЧ";

      Запрос.УстановитьПараметр("Ссылка", Ссылка);

      РезультатЗапроса = Запрос.Выполнить();


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

Далее сформируем движения по регистру.

Движения.ОстаткиТоваров.Записывать = Истина;

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

      Движение = Движения.ОстаткиТоваров.Добавить();

      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

      Движение.Период = Дата;

      Движение.Номенклатура = Выборка.Номенклатура;

      Движение.Склад = Склад;

      Движение.Количество = Выборка.Количество;

КонецЦикла;

Движения.Записать();


В приведенном примере я подразумеваю, что для документа установлен режим записи движений «Записывать выбранные». Именно поэтому я перед циклом установил пометку необходимости записи движений (на самом деле это можно было сделать и после цикла).

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

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

Запрос.Текст = "ВЫБРАТЬ

|     Номенклатура,

|     КоличествоОстаток КАК Остаток

|ИЗ

|     РегистрНакопления.ОстаткиТоваров.Остатки(

|                       ,

|                       Склад = &Склад

|                            И Номенклатура В

|                                  (ВЫБРАТЬ

|                                        ДокТЧ.Номенклатура

|                                  ИЗ

|                                        ДокТЧ КАК ДокТЧ))

|ГДЕ

|     КоличествоОстаток < 0";



Запрос.УстановитьПараметр("Склад", Склад);

РезультатЗапроса = Запрос.Выполнить();


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

Обратимся к результату запроса и известим пользователя о минусах на складе.

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

            Сообщение = Новый СообщениеПользователю;

            Сообщение.Текст = "Не хватает товара " + Выборка.Номенклатура + ", после проведения документа остаток составит " + Выборка.Остаток;

            Сообщение.Сообщить();

            Отказ = Истина;        

КонецЦикла;


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

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

Автор: Павел Чистов
audit7buh, logist, mister-x, Sergio_zab,
28.02.11, 9:24 Новые возможности платформы 8.2. Модуль менеджера
«Модуль менеджера объекта»

[attachment=291:Modul__menedgera.png]

С выходом платформы 8.2 появился ряд новых механизмов. Рассмотрим работу с Модулем менеджера объектов.

Пожалуй, начнем сразу с практического примера.

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

Создадим функцию, возвращающую список «важных» реквизитов в зависимости от вида контрагента:

Функция ПолучитьВажныеРеквизиты(ВидКонтрагента)

МассивРеквизитов = Новый Массив;

Если ВидКонтрагента = Перечисления.ВидыКонтрагентов.Поставщик Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ИНН");
МассивРеквизитов.Добавить("ТипЦен");
МассивРеквизитов.Добавить("ЛимитКледита");

ИначеЕсли ВидКонтрагента = Перечисления.ВидыКонтрагентов.Покупатель Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ФактАдрес");
МассивРеквизитов.Добавить("ПроцентБонусов");

ИначеЕсли ВидКонтрагента = Перечисления.ВидыКонтрагентов.Банк Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ИНН");
МассивРеквизитов.Добавить("БИК");

ИначеЕсли ВидКонтрагента = Перечисления.ВидыКонтрагентов.Налоговая Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ИНН");
МассивРеквизитов.Добавить("КодИФНС");

КонецЕсли;

КонецФункции


Где же ее правильнее разместить?

Напрашивается вариант - в процедуре Модуля объекта «ПередЗаписью()». Тем самым мы на этапе записи будем контролировать правильность заполнения нужных нам реквизитов. С точки зрения создания, изменения элемента справочника, нас все устраивает. Но если нам необходимо, чтобы некоторые менеджеры заносились контрагентов в ИБ без контроля, а спустя какое-то время мы будем выполнять проверку на корректность заполнения данных в справочнике. Тогда нужно будет написать обработку. И в этой обработке, перебирая элементы, проверять заполнение реквизитов. Т.о. эту функцию придется разместить в коде обработки. А это получается дублирование кода, со всеми вытекающими проблемами. Можно получать объект каждого элемента, обращаться к функции, расположенной в его Модуле объекта. Но это будет дополнительные обращения к БД, тогда как в обработке нам достаточно только ссылок.

Можно выйти из этой ситуации создав Общий модуль «РаботаСКонтрагентами» и разместить в нем функцию возвращающую список реквизитов для проверки. В этом случае будем обращаться так «РаботаСКонтрагентами.ПолучитьСписокВажныхРеквизитов(ВидКонтрагента)».

Но! На платформе 8.2 как раз для решения подобной задачи и был создан Модуль менежера. Там и разместим нашу функцию. А обращаться мы будем: «Справочники.Контрагенты.ПолучитьСписокВажныхРеквизитов(ВидКонтрагента)».

Т.о. на ряду с предопределенными методами, мы можем самостоятельно разработать свои процедуры и обращаться к ним как методам Менеджера объекта, через точку. У нас отпадает необходимость создавать «тематические» внешние модули такие как «Работа с Контрагентами», «Процедуры Номенклатуры»...

Обратимся теперь к теории, чтобы «разложить все по полочкам».

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

Отобразим иерархию классов прикладных объектов на примере Справочников:

[attachment=292:Ierarhia_klassov.png]

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

Кроме возможности расширения методов класса, в модуле менеджера существует предопределенная процедура События «ОбработкаПолученияДанныхВыбора». Она возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе, а также при выполнении метода «ПолучитьДанныеВыбора()».

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

Автор: Шумаев Алексей
mister-x,
28.02.11, 9:21 Пакетные запросы
История развития запросов

Простые запросы

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

Структура конфигурации представлена на рисунке.

[attachment=290:1.png]

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   РезультатЗапроса = Запрос.Выполнить();
   Выборка = РезультатЗапроса.Выбрать();

   Пока Выборка.Следующий() Цикл

   //Проверка отрицательных остатков

   //Проведение по регистру

   КонецЦикла;

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


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

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


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

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

Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

МВТ = Новый МенеджерВременныхТаблиц;

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить(); //Прим. 1

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура
|ПОМЕСТИТЬ СписокТоваров
|ИЗ
| Документ.Расходная.Товары
|ГДЕ
| Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить(); //Прим. 2

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "
|ВЫБРАТЬ
| Док.Номенклатура,
| Док.Количество КАК Док_Количество,
| ЕСТЬNULL(Рег.КоличествоОстаток,0) КАК Рег_Количество
|ИЗ
| ДокТЧ КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ
|  РегистрНакопления.ОстаткиТоваров.Остатки(,
|  Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ
|                           Номенклатура
|                          ИЗ
|                           СписокТоваров КАК СписокТоваров)) КАК Рег
| ПО
|  Док.Номенклатура = Рег.Номенклатура";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

  //Проверка отрицательных остатков

  //Проведение по регистру

КонецЦикла;

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


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

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

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

Пакетные запросы

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

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

В тексте запроса, запросы пакета разделяются символом «;» (точка с запятой). Область имен виртуальных таблиц у одного пакетного запроса одна. Использование менеджера временных таблиц не требуется, но возможно если вы хотите передать временные таблицы из одного пакетного запроса в другой.

Перепишем процедуру для использования пакетных запросов:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
МассивРезультаттов = Запрос.ВыполнитьПакет(); //Прим. 1
РезультатЗапроса = Запрос.Выполнить(); //Прим. 2
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

//Проверка отрицательных остатков

//Проведение по регистру

КонецЦикла;

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


Фактически я убрал определение объекта запрос и использование менеджера временных таблиц, объединил тексты запросов (обратите внимание на разделитель «;» между текстами). В результате текст запроса стал читабельнее (а при использовании конструктора запросов намного увеличивается удобство чтения запроса).

После выполнения запроса в переменную МассивРезультатов у нас попадет 3 элемента. Первые два будут содержать число характеризующее количество записей помещенных во временные таблицы ДокТЧ и СписокТоваров, а третий будет содержать выборку с полями Номенклатура, Док_Количество и Рег_Количество.

В переменную РезультатЗапроса попадет только выборка.

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

Автор: Павел Чистов
Lea, MH.z, mister-x, Trintintin,
28.02.11, 9:16 Хитрости быстрого перевода конфигураций на 8.2
Последовательность действий по адаптации конфигураций к работе без режима совместимости 8.1 довольно проста. Она описывается в книге М.Г.Радченко «1С:Предприятие 8.2 Коротко о главном». Большинство их не должно вызвать затруднений даже у простого пользователя, не говоря уж об администраторах баз данных.

Однако наряду с тривиальными действиями типа проставления нужных галочек в свойствах объектов, предъявляются требования к программному коду:
В модулях не должно быть функций ПроверитьЗаполнение().
Обработка заполнения должна учитывать вызовы с иными значениями параметра, нежели ссылки на объект-основание.
Есть особенность использования ключевых слов РАЗЛИЧНЫЕ вместе с УПОРЯДОЧИТЬ ПО в текстах запросов.



Как и многие из партнеров 1С, сначала мы использовали 8.2 для целей внутреннего учета.

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



1. Решить проблему с функцией ПроверитьЗаполнение() достаточно просто. Для этого нужно выбрать Правка - Глобальная замена, в поле «Искать» поставить строку «Функция ПроверитьЗаполнение()», в поле «Заменить» - «Функция ПроверитьЗаполнение_Старая()», или что-то на свое усмотрение. После чего синтаксический контроль будет пройден без ошибок (разумеется, если разработчик напечатал именно так, без лишних пробелов между словами).

2. С процедурой ОбработкаЗаполнения(Основание) можно было бы сделать точно также, однако тогда перестанет отрабатывать имеющийся в конфигурации код. Поэтому решение такое: в поле «Искать» -«Процедура ОбработкаЗаполнения(Основание)»; в поле «Заменить» - «Процедура ОбработкаЗаполнения(Основание) Попытка м = Основание.Метаданные(); Исключение Возврат; КонецПопытки;». Вставка прерывает выполнение обработчика, если значение параметра не имеет метода Метаданные().

3. И наконец, самое сложное - с запросами. Задача в том, чтобы добавить выражения, по которым упорядочивается результат, в секцию «Выбрать». Делать это, разумеется, все равно нужно будет вручную. Но сложность заключается уже в том, чтобы найти такие запросы, потому что просмотр всех модулей конфигурации займет у специалиста немало времени. Таким образом, было бы удобно знать заранее, в запросах каких модулей встречаются одновременно слова «РАЗЛИЧНЫЕ» и «УПОРЯДОЧИТЬ». Для этого, я написал обработку - анализатор программных модулей. Работает примерно также как и тот что выложен на сайте 1С, но немного хитрее, отсекая лишние сработки. Скажу сразу, на сто процентов решить проблему не получится, потому что запрос может составляться динамически из нескольких текстовых блоков. В настоящее время, с момента выхода версии 8.1, от этого отказываются в пользу временных таблиц и приемов оптимизации кода, позволяющих открывать текст в конструкторе. Однако такие блоки кода все еще встречаются, и исключать их неправильную работу нельзя. Анализатор может работать в двух режимах:

1) Искать сочетание внутри одного блока текста (хотя он может быть разделен вставками, не содержащими «;». Например "выбрать различные ссылка из Документ."+имя+" упорядочить по номер")

2) Искать сочетание внутри всех текстовых блоков одного модуля, не взирая на границы.

Имеет 2 параметра:

- Путь (к папке с файлами модулей)

- ИскатьНеОпределяяГраницыБлоков (см. режимы работы).

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

Спасибо за внимание.

//Листинг:

&НаКлиенте

Процедура Проверить(Команда)

            НайденныеФайлы = НайтиФайлы(Объект.Путь, "*.txt");

            н = 0;

            к = НайденныеФайлы.Количество();

            Для каждого ф из НайденныеФайлы Цикл            

                        Т = новый ТекстовыйДокумент;

                        Т.Прочитать(ф.ПолноеИмя);

                        Текст = т.ПолучитьТекст();

                        Текст = СтрЗаменить(Текст,"Различные","различные");

                        Текст = СтрЗаменить(Текст,"РАЗЛИЧНЫЕ","различные");          

                        Текст = СтрЗаменить(Текст,"Упорядочить","упорядочить");

                        Текст = СтрЗаменить(Текст,"УПОРЯДОЧИТЬ","упорядочить");

                        Состояние("Прогресс "+Формат(н/к*100,"ЧДЦ=0")+"%. Текущий файл: "+ ф.имя+" ");

                        Если Анализ(Текст) Тогда

                                   Сообщить( ф.имя);                

                        КонецЕсли;                                        

                        н = н+1;          

            КонецЦикла;

            Сообщить("Анализатор текстов программных модулей  предназначен для адаптации запросов к 8.2 (с) Андреев Н.О. ООО ""Аллегро Информационные Технологии"". Все права зарезервированы.");

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



&НаКлиенте

Функция Анализ(знач Т)

                        режим = 0;

                        КавычкаЗакрыта = истина;

                        к = СтрЧислоСтрок(т);

                        Для н = 1 по к Цикл

                                   строка = СтрПолучитьСтроку(т,н);

                                   Поз = Найти(строка,"//"); // Не учитываем комментарии

                                   Если поз<>0 Тогда

                                               строка = лев(строка,поз-1);

                                   КонецЕсли;



                                   ПервоеВхождениеКавычки = 0;

                                   ОтфильтрованаяСтрока = "";

                                   Пока Истина Цикл

                                               Поз = Найти(строка,"""");     // Интересны только блоки текста (запросы), причем

                                               Если Не поз = 0 Тогда                      //если запрос формируется динамически, надо учитывать только текст внутри кавычек

                                                           Если НЕ КавычкаЗакрыта Тогда

                                                                       ОтфильтрованаяСтрока = ОтфильтрованаяСтрока + ЛЕВ(Строка,поз-1);                                                  

                                                           КонецЕсли;

                                                           КавычкаЗакрыта = НЕ КавычкаЗакрыта;

                                                           строка = Прав(строка,СтрДлина(Строка)-поз);

                                                           Поз1 = Найти(строка,";");

                                                           Поз2 = Найти(строка,"""");

                                                           Если НЕ Объект.ИскатьНеОпределяяГраницыБлоков И (Не поз1 = 0) И КавычкаЗакрыта //Найдена точка с запятой

                                                                       И (Поз2 = 0 ИЛИ (Поз1<Поз2)) // она находится вне блока текста

                                                                       Тогда

                                                                       режим = 0; //Этот блок закончился

                                                           КонецЕсли;                                                                

                                               Иначе

                                                           Прервать;

                                               КонецЕсли;                

                                   КонецЦикла;



                                   Если НЕ КавычкаЗакрыта Тогда

                                               ОтфильтрованаяСтрока = ОтфильтрованаяСтрока + Строка;

                                   КонецЕсли;



                                   строка = ОтфильтрованаяСтрока;



                                   Если Режим = 0 Тогда //Пока ничего не нашли

                                               Поз = Найти(строка,"различные");

                                               Если Не поз = 0 Тогда

                                                           режим = 1;

                                               КонецЕсли;                            

                                   КонецЕсли;

                                   Если Режим = 1 Тогда //Нашли "различные", ищем "упорядочить" в том же блоке текста                                    

                                               Поз = Найти(строка,"упорядочить");

                                               Если Не поз = 0 Тогда //нашли в том же запросе второй признак

                                                           Возврат истина;

                                               КонецЕсли;                                                                                                              

                                   КонецЕсли;

                                   ОбработкаПрерыванияПользователя();

                        КонецЦикла;

                        Возврат ложь;

КонецФункции


&НаКлиенте

Процедура ПутьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

            Режим = РежимДиалогаВыбораФайла.ВыборКаталога;

            ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);

            ДиалогОткрытияФайла.Заголовок = "Выберите каталог";

            Если ДиалогОткрытияФайла.Выбрать() Тогда

                        Объект.путь = ДиалогОткрытияФайла.Каталог;

            КонецЕсли;

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


Автор: Андреев Никита Олегович
Atanasov, irinali, kserg2012, mister-x,
28.02.11, 8:49 С днём рождения, 5_kopeek!
Смотрю, у нашей дамы сегодня днюха smile.gif
Хочется её поздравить и пожелать всего наилучшего, всего, чего она сама себе пожелает!

5_kopeek, мы очень рады, что вы присоединились к нашему форуму! С днём рождения! icon_087.gif
5_kopeek,
26.02.11, 13:50 Помогите с написанием реестра НН для конфигурации А4: БТР Релиз 3.22/99
Слил в одну тему, продолжаем здесь.
yfrf111,
25.02.11, 14:59 Как установить категорию товаров программно?
Вобще-то взаиморасчеты хранятся в разрезе документов. В вашем случае прийдется при выводе перебирать каждый документ и делить его на 2 суммы, в зависимости от вида товара. Правильно? Может тогда лучше будет при проведении делать 2 движения по взаиморасчетам? А хотя тогда нужно будет и думать над тем, как закрывать долги. Ну это так, мысли.

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

Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ИспользоватьРодителя(ГруппаРодитель, 0); // ГруппаРодитель - группа, выбранная в форме
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 1 Тогда
   Продолжить;
КонецЕсли;
Спр.КатегорияТовара = ВыбКатегорияТовара; // ВыбКатегорияТовара - выбирается в форме
Спр.Записать()
КонецЦикла;


Как-то так, наверное.
Flexy,
24.02.11, 20:12 Баг в реестре налоговых накладных в "Торговля + склад", 20 релиз
Проявляется: при экспорте отчета за месяц, а именно в том, что при открытии запоминает текущую дату. Когда ставим галку "за месяц", запоминает последний месяц выбранного перед этим квартала и потом ему пофиг, что мы выбираем другой месяц! При экспорте, соответственно, говорит, что это реестр не за январь, например, а за март.

Лечится: в отчете есть такой участок:
//=====================================
Процедура ПлюсПериод()
    ДатаОтчета   = ДобавитьМесяц(ДатаОтчета,ДлинаТекПериода());
    ПериодОтчета = КварталОтчетаСтр();
КонецПроцедуры

//=====================================
Процедура МинусПериод()
    ДатаОтчета = ДобавитьМесяц(ДатаОтчета,-ДлинаТекПериода());
    ПериодОтчета = КварталОтчетаСтр();
КонецПроцедуры

// ===============================
Процедура ИзмТипПериода()
    ПериодОтчета = КварталОтчетаСтр();
    Если ТипПериода = 1 Тогда      
        PERIOD_TYPE = 1;  
        HZKV = "";
        HZM = ДатаМесяц(ДатаОтчета);
        PERIOD_MONTH = HZM;
    Иначе        
        PERIOD_TYPE = 2;  
        HZKV = ДатаМесяц(КонКвартала(ДатаОтчета))/3;
        PERIOD_MONTH = HZKV*3;
        HZM = "";      
    КонецЕсли;
    HZY = ДатаГод(ДатаОтчета);
КонецПроцедуры


Нужно его привести в такой вид:

// ===============================
Процедура ИзмТипПериода()
    ПериодОтчета = КварталОтчетаСтр();
    Если ТипПериода = 1 Тогда      
        PERIOD_TYPE = 1;  
        HZKV = "";
        HZM = ДатаМесяц(ДатаОтчета);
        PERIOD_MONTH = HZM;
    Иначе        
        PERIOD_TYPE = 2;  
        HZKV = ДатаМесяц(КонКвартала(ДатаОтчета))/3;
        PERIOD_MONTH = HZKV*3;
        HZM = "";      
    КонецЕсли;
    HZY = ДатаГод(ДатаОтчета);
КонецПроцедуры

//=====================================
Процедура ПлюсПериод()
    ДатаОтчета   = ДобавитьМесяц(ДатаОтчета,ДлинаТекПериода());
    ПериодОтчета = КварталОтчетаСтр();
    ИзмТипПериода();
КонецПроцедуры

//=====================================
Процедура МинусПериод()
    ДатаОтчета = ДобавитьМесяц(ДатаОтчета,-ДлинаТекПериода());
    ПериодОтчета = КварталОтчетаСтр();
    ИзмТипПериода();
КонецПроцедуры


ЗЫ. очередной "привет" ребятам из АББИ icon_bash.gif
Pepe,
24.02.11, 11:33 Помогите с написанием реестра НН для конфигурации А4: БТР Релиз 3.22/99
Цитата
Нет, не помогло, как выдавало месяц "2" так и выдает, ошибок нет. А нужно чтобы выдавало "02", при выборе месяца!

А я что говорил, что выдаст 02? Я ж не решаю вашу задачу. Я разделил на отдельные переменные номер месяца. Что делать дальше - сами думайте.
yfrf111,
24.02.11, 8:10 Составьте запрос по регистру бухгалтерии
ВЫБРАТЬ
    ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот,
    ХозрасчетныйОборотыДтКт.ВалютнаяСуммаОборотКт КАК ВалютнаяСуммаОборотКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, , СчетДт В (&СписокСчетов), , , , ) КАК ХозрасчетныйОборотыДтКт
ГДЕ
    ХозрасчетныйОборотыДтКт.Организация = &Организация
logist,
24.02.11, 7:57 Загрузка данных из *.csv в ТаблицуЗначений
Есть строка, вида: "Один;Два;Три"

Если не заморачиваться с универсальностью:

// ТекСтрока - полученная строка
        
Один = Лев(ТекСтрока, Найти(ТекСтрока, ";")-1);
ТекСтрока = Прав(ТекСтрока, СтрДлина(ТекСтрока) - Найти(ТекСтрока, ";"));
        
Два = Лев(ТекСтрока, Найти(ТекСтрока, ";")-1);
ТекСтрока = Прав(ТекСтрока, СтрДлина(ТекСтрока) - Найти(ТекСтрока, ";"));
        
Три = ТекСтрока;
Salex,
23.02.11, 12:13 Помогите с написанием реестра НН для конфигурации А4: БТР Релиз 3.22/99
yfrf111, алё!
Хватит жестко офтопить. Изначальный вопрос решён? Если решён - создаём другую тему с новым вопросом, если нет - продолжаем писать здесь по теме. Не нужно всё свои вопросы сваливать в одну тему! 59000000.gif
yfrf111,
21.02.11, 20:37 Скачать 1С конфигурации
Если вы зашли сюда, то наверняка вы писали в поисковой системе что-то вроде: 1С бухгалтерия скачать, 1С скачать бесплатно, скачать конфигурации 1С, скачать 1С 8 и т.п.

Но дабы развеять ваши мысли и внести ясность, насчет "скачать бесплатно 1С" и нашего форума - была создана эта тема.

А теперь, внимание: у нас на форуме нельзя скачать никакое программное обеспечение 1С. И даже просить нельзя! Посты попрошаек будут удаляться, а сами попрошайки наказываться. На нашем форуме обсуждается, непосредственно, работа с программой 1С на программистском и пользовательском уровне (ну и ещё кое-что).

Поэтому, если вы хотите только скачать бесплатно конфигурации 1С или какое-нибудь ПО 1С - проходите мимо.

С уважением, Вофка.
Alexx27, Alien900, Antares666, Atomino, AZ_Stranger, Batchir, bob210250, Dagmanor, DartRomanius, dober, f12, Fedkozak, grg21, klymets, Laila, levi, Maai, Motoexpress, Neposyda, niconix, okman2018, Pepe, PeshaX, Romeo24, rotting, semenich2002, sergeyfit, serg_ua, Serjoose, sv111, Titarc0m, vk44, Vlad 1C, xSer, yur, Ziam, КЙМ,
20.02.11, 11:39 Налоговая накладная, 2011
yfrf111, вы б плюсанули тем, кто помагал wink.gif
awp, yfrf111,
16.02.11, 9:40 Выгрузка отчета ЕСВ в "АРМ Звіт страхувальника"
Нашёл такую инфу:

Цитата
ВАЖЛИВЕ ОНОВЛЕННЯ ДЛЯ "ЄДИНОГО ВНЕСКУ"

ОНОВЛЕННЯ 8.98.000

Для формування НОВОЇ щомісячної звітності до Пенсійного фонду України
за 2011 рік необхідно користуватися
програмним забезпеченням
„АРМ Звіт страхувальника (Версія 8.98.000 від 07.02.2011 р.)”.
kujbpfu-zp.at.ua


Вот темка.
logist,
15.02.11, 16:42 Возможность выбора регистратора партии (из регистра ОстаткиПоПартиям)
Цитата
Конфигурацию делаю с нуля на платформе 8.1

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

Цитата
мой шеф наотрез отказался от типовой

Да уж. А можно узнать причину отказа (интересно просто)?
Salex,
15.02.11, 13:40 Тяжело найти работу начинающему программисту 1С
Я тоже когда-то задавался таким вопросом. Решил попробовать:
- есть заказы - есть зарплата. Нет заказов - сосите палец.
- сам себе должен "наколядовать" работу, обзванивая "своих" клиентов и предлагая им нужные и не нужные вещи.
- беготня и дежурство на линии консультации - тоже не самое приятное.
- приоритет в работе отдается сотрудникам, которые проработали дольше, т.е. если устроился последний - то работа будет, если все остальные "при деле"
- в плане нового опыта я для себя вынес мало оттуда. Единственный опыт, который, я считаю был полезный, это работа с лицензионным ПО.
В общем, из ожидаемых 100% я получил 5 - 10%. Проработал пол года и уволился.

Остался в хороших отношениях с директором. Это, наверное, самое полезное, что я получил от этой работы. smile.gif

Если хочется интересной, "реальной" работы без опыта - франч в этом не поможет.

ИМХО.
Flexy, Zaval,
15.02.11, 12:24 Не срабатывает СтрЗаменить()
Цитата
СтрЗаменить(<?>,,)
Синтаксис:
СтрЗаменить(<СтрИсточник>,<СтрПодстрока>,<СтрЗамены>)
Назначение:
Возвращает строку, полученную из строки поиска заменой всех вхождений шаблона поиска строкой замены.
Параметры:
<СтрИсточник> - строка в которой ищем (место поиска);
<СтрПодстрока> - строка которую ищем (шаблон поиска);
<СтрЗамены> - строка, которой заменяем найденную подстроку (строка замены).


Т.е. надо так:
ЭлПроверки = "015";
ЭлПоиска = "0";
ЭлЗамены = "";
ЭлПроверки = СтрЗаменить(ЭлПроверки,ЭлПоиска,ЭлЗамены);
DAS_Alex,
14.02.11, 11:23 Определить "описание" прикладного объекта по непосредственно объекту или ссылке на него
Цитата
как можно определить принадлежность объекта к Справочникам, РегистрамНакопления, Документам......?

Наверное через
Метаданные()

и
Документы
,
Справочники

...

Времени сейчас нет разбираться и написать более точно, но думаю нужно смотреть в этом направлении
Dmitriy-CoDy,
10.02.11, 8:01 Batchir, с днюхой! :)
Сегодня у Батчира днюха!
Хочется его поздравить и пожелать всего самого наилучшего: здоровья, денег и всего, что душа пожелает!!! icon_beer17.gif
Batchir,
09.02.11, 20:39 Генератор случайных чисел в 1С
Ключевые слова: генератор, случайный, чисел, число, алгоритм, random, randomize, распределение, равномерное, лотерея


insider:

Вот не думал, что в 1С пригодится, а вот на Вам.. клиенты решили акцию провести, типа "собери крышечки", только собирать нужно слова, кто правильное слово из своего набора букв соберет - тот и выиграл. Задача вообщем казалось бы простая: имеется алфавит, имеется некое слово, которое нужно собрать, например "коньяк", в нем 6 букв, как видите.

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

Дополнительное условие: все эти варианты (правильные и нет) нужно пронумеровать, чтобы при получении "призовой" карточки можно было бы сверить номер (а был ли такой).

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

В общем задача сводится к следующему:
1. Генерить случайные числа, желательно с большим разбросом.
2. По числу вычислять комбинацию букв (т.е. найти какое-то соответствие между возможныи комбинациями и их номерами).
3. Пункт обратный предыдущему - по слову проверять номер комбинации.

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

Решение:
1. т.к. генератор от avb и NS давал маленький разброс случайных чисел, пришлось поюзать немного другой алгоритм:

function Random()
    if emptyvalue(randSeed) = 1 then
        randSeed = _getperformancecounter();
    endif;                      
    
    randSeed=(a*randSeed+c)%m;
    return randSeed;
endfunction


Здесь:
a=1664525; c=1013904223; m=4294967296;
последняя переменная - 2 в 32-й степени, две другие - рекомендуемые для таких целей коэффициенты

Ограничение по максимальному значению 2^32 выбрано исходя из максимального кол-ва комбинаций (для обрезанного алфавита в 28 букв и слов по 7, т.к. в реальной задаче их именно 7, общее число комбинаций составит 28^7, таким образом выбранное ограничение лежит примерно посередине интервала, что вполне достаточно для выборки 20-30 тыс. вариантов)

Нам также понадобится еще одна вспомогательная функция - возведение в целочисленную положительную степень:

Функция Степень(Знач а,Знач б, Рез=1)
    Если б>0 Тогда
        Рез=Рез*а;    
        б=б-1;
        Степень(а,б,Рез);
        Возврат Рез;
    Иначе
        Возврат Рез;
    КонецЕсли;
КонецФункции


Здесь: а - основание степени, б - показатель степени, Рез - результат


2. Выявить зависимость между последовательно расположенными комбинациями, оказалось на удивление простым:

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

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

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

Получившийся код:

Функция ПолучитьСимволы(Поз,ТекСимв=1,СимСтр="")
    Если ТекСимв<к Тогда
        Делитель=Степень(СтрДлина(Буквы),к-ТекСимв);
        ТекОст=Поз%Делитель;
        СимСтр=Строка(СимСтр)+Сред(Буквы,Цел(Поз/Делитель+?(ТекОст>0,1,0)),1);    
        ПолучитьСимволы(ТекОст,ТекСимв+1,СимСтр);
        Возврат СимСтр;
    Иначе          
        СимСтр=СимСтр+Сред(Буквы,(?(Поз=0,СтрДлина(Буквы),Поз)),1);
        Возврат СимСтр;
    КонецЕсли;
КонецФункции


Здесь:
Поз - номер комбинации (псевдослучайное число)
ТекСимв - текущий обрабатываемый символ
СимСтр - резльтирующая строка символов
Буквы = строка, содержащая буквы алфавита в стандартном порядке ("абв...юя")
к - число символов в искомом слове (в данном случае = 6)

3. Обратное преобразование также тривиально:

Функция ПолучитьКомбинацию(Слово,ТекСимв=0,Поз=0)
    НомСимв=Найти(Буквы,Сред(Слово,к-ТекСимв,1));
    Если ТекСимв>0 Тогда
        Если ТекСимв<к Тогда
            Поз=Поз+(НомСимв-1)*Степень(СтрДлина(Буквы),ТекСимв);
            ПолучитьКомбинацию(Слово,ТекСимв+1,Поз);
        Иначе
            Возврат Поз;
        КонецЕсли;
    Иначе
        Поз=?(НомСимв=СтрДлина(Буквы),0,НомСимв);
        ПолучитьКомбинацию(Слово,ТекСимв+1,Поз);
        Возврат Поз;
    КонецЕсли;
КонецФункции


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

//********************************************************************************
************************

Премешать N чисел:

Для а=1 по N цикл 
массив[а]=а;
Конеццикла;
Для а=1 по N-1 цикл
Сл=Случ(а,N);// Целое случайное число в интервале [а..N]
К=массив[а];
массив[а]=массив[Сл];
массив[Сл]=К;
КонецЦикла;


//********************************************************************************
************************

Sc    =    CreateObject("MSScriptControl.ScriptControl"); 
Sc.language    =    "VBscript";
sc.executeStatement("randomize");  
оноВотТутаБудет=Sc.eval("rnd");


Как сделать чтобы числа выбирались произвольно от 1 до 100?

Ранд=_GetPerformanceCounter()%(100+1);


похоже это лучшеее

//********************************************************************************
************************

В 8.0 для получения случайных чисел можно использовать встроенный генератор GUID.
Вот пример простенькой функции:

//только для целых чисел
Функция ПолучитьСлучайноеЧисло(Мин,Макс)
    
    //вместо Randomize
    Для н = 1 По 100 Цикл
        Уник = Новый УникальныйИдентификатор;
    КонецЦикла;
    
        //генерируем GUID
    Уник = СокрЛП(Новый УникальныйИдентификатор);

        //оставляем только цифры
    Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");

    //знаменатель должен иметь такое же количество нулей + 1
    Знаменатель = 10;
    Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
        Знаменатель = Знаменатель * 10;
    КонецЦикла;
    
    Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1
    
    //преобразуем его в случайное число из заданного интервала, округляем до целого
    ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
    
    Возврат ЧислоИзИнтервала;

КонецФункции


Взято отсюда

//********************************************************************************
************************

ЗЫ. я набрёл на эту статью в поисках генератора случайных чисел. Так вот для себя я выбрал вариант
Ранд=_GetPerformanceCounter()%(100+1);
mister-x, telemost,
09.02.11, 11:44 Не отображает данные в форме
Цитата
ибо бухи будут умирать что им прейдется перебивать неделю работы.

Ещё бы icon_crazy7.gif

Цитата
и как теперь востановить это если возможно

Варианта 2:
1. Вы убили реквизит "премия" вообще. Это значит, что старые документы сохранят свои проводки, но при пересчее каком-то может возникнуть беда, поэтому их лучше не трогать.
2. Вы затерли реквизит "премия" на форме. Добавьте.
sia_1980,

80 страниц V  « < 69 70 71 72 73 > » 
RSS Текстовая версия Сейчас: 18.04.24, 5:07
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!