Утробин Михаил | Руководитель отдела внедрения 1С | Группа Компаний ЛАД

«Как не надо внедрять 1С:ERP. Развеем мифы о внедрении»

На примере 8-9 советов хочу рассказать о том, как лучше подойти к внедрению ПП 1С у себя на предприятии. МИФ 1: Внедрим и автоматизируем сразу все! МИФ 2: Учет в единой базе - это хорошо! МИФ 3: Лучший внедренец - Программист, по совместительству Администратор МИФ 4: Установим и начнем вести учет, а там разберемся! МИФ 5: Хочу максимальную функциональность ERP! МИФ 6: Лучшее время перехода на новую систему - с 1 января МИФ 7: Ввод в эксплуатацию нам не нужен, так как пользователи прошли обучение, сами разберутся МИФ 8: На поддержке сэкономим. Кто не разберется урежем премию При этом в рассказе могу добавить примеры на реальных кейсах, как это было на наших проектах. К чему привело то или иное решение, как правильно, как неправильно. В целом, при подходе используя метод "как не нужно делать", объясняется, как же все-таки на самом деле нужно внедрять проект. В этом и есть суть доклада.

Запрос в 7.7

1. n_spb 18.12.16 19:21 Сейчас в теме
Подскажите по запросу в 7.7. Нужно выбрать все элементы справочника номенклатура из определенной группы.
Сделал так:
Запрос = СоздатьОбъект("Запрос");
		    ТекстЗапроса = "
		    |Обрабатывать Все;
		    |Спр   = Справочник.Номенклатура.ТекущийЭлемент;
		    |Условие(Спр в ВыбНоменклатура);
		    |Группировка Спр Все;
		    |";

В ВыбНоменклатура группа справочника из которой нужно выбрать все элементы и группы.
Ответы
Сортировка: Древо
4. DWZ2 20.12.16 05:53 Сейчас в теме
(1)

Я бы лично писал просто
|Группировка Спр;


ВыбНоменклатура, кстати, должна быть группой и не пустым значением, то есть должно быть ВыбНоменклатура.Выбран()=1.

А что конкретно не работает / работает не так?
2. Harry_udm 2 18.12.16 22:23 Сейчас в теме
Ну так и проверьте: работает ли? Должно работать...
Конструктор запросов выдает практически такую же структуру:
	ТекстЗапроса = "
	|Спр = Справочник.Номенклатура.ТекущийЭлемент;
	|Группировка Спр все;
	|Условие(Спр в ВыбНоменклатура);
	|;";
6. n_spb 20.12.16 21:02 Сейчас в теме
(2) Мой вариант, работает. Делал его без конструктора, сомневался просто, что грамотно его сделал. Подскажите, где про запросы и конструктор в 7.7 почитать.
(4) Работает. А где написать ВыбНоменклатура.Выбран()=1?
7. DWZ2 20.12.16 22:41 Сейчас в теме
(6)
Мой вариант, работает.


Значит, не страшно.

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


Просто обычно со словом "Группировка" пишут КОГДА НАДО или "Без Групп" или "Упорядочить По". А когда не надо - ничего не пишут.

Подскажите, где про запросы и конструктор в 7.7 почитать.


В ЖКК - жёлто-красных книжках, то есть в документации по Конфигуратору (2 тома) и по языку (тоже 2 тома).

А где написать ВыбНоменклатура.Выбран()=1?


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

А вообще "в лучших домах" пишут так:


Если ВыбНоменклатура.Выбран()=1 Тогда
    // 
    Если ВыбНоменклатура.ЭтоГруппа()=1 Тогда
         ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";
    Иначе
         ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр = ВыбНоменклатура);";
   КонецЕсли;
КонецЕсли;

Показать


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

Также рекомендую разбивать запрос на строчки, то есть писать НЕ

ТекстЗапроса=ТекстЗапроса+"Условие (Спр В ВыбНоменклатура);";


а

ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";


или

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


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

Кстати, если будете смотреть текст ВНЕ отладчика, делайте через Предупреждение(), а не через Сообщить(). Не забудьте только убрать :))), а то пользователи будут недовольны.
5. DWZ2 20.12.16 06:14 Сейчас в теме
(3)

Там не про семёрочный запрос.
8. DWZ2 20.12.16 22:53 Сейчас в теме
Кстати, если не нужно группировать, и данные хранятся в виде DBF, то будет быстрее через цикл с ВыбратьЭлемент()/ПолучитьЭлемент(). Так как:

1) С запросом у Вас будет 2 прохода по базе, а так один. (Правда, второй может быть меньше, если в запросе стоит "мощное" условие)

2) Можно будет использовать индекс в БД через свойство "Сортировка" у реквизита. Запрос по справочникам индексы НЕ использует.
9. DWZ2 21.12.16 12:24 Сейчас в теме
Кстати, в запросе можно фильтровать по списку значений, в том числе в виде органа управления в форме. В этом списке могут быть и элементы и группы в любом сочетании. Тут уж "В" работает в обоих случаях. Если элемент списка - элемент справочника, то 1С автоматически проверяет на равенство, а если группа - на вхождение. То есть можно писать

Если ВыбНоменклатура.РазмерСписка()>0 Тогда
         ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";
КонецЕсли;


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


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

Лично мне лень переключать алфавит для печать знака ">", поэтому я пишу наоборот:
Если ВыбНоменклатура.РазмерСписка()=0 Тогда
      ЗаголовокПоНоменклатуре  ="По номенклатуре из списка: " +    ВыбНоменклатура.ВСтрокуСРазделителями();

Иначе
      ЗаголовокПоНоменклатуре  ="По всей номенклатуре";
      ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";

КонецЕсли;
Показать


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

Вакансии


Программист 1С
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Преподаватель 1С
Санкт-Петербург
Полный день

Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 150 000 руб.
Полный день