Рубрики
Примеры

Подбор по первым символам на 1С 8.3 (как было в 1С 7.7)

Сейчас расскажу про одну из самых больных тем — подбор номенклатуры в документ. Это, конечно, очень спорный момент, особенно сейчас, когда большое количество документов создается с помощью загрузки (с сайтов, из прайс-листов или каталогов, мобильных устройств, ЭДО, EDI и т.д.), но все равно есть еще компании, которые работают по-старинке, создавая документы «по-телефону», с бумажных носителей. И в этом случае на первый план выходит скорость и удобство подбора номенклатуры в документ.

Сейчас разработчики 1С всех склоняют к полнотекстовому поиску. Это достаточно удобно, но далеко не всегда. Например:

  • Полнотекстовый поиск постоянно обращается к серверу, а это задержки. Я, как ни старался настроить этот поиск, все-равно выходило около 0.2 секунды задержка после ввода символа. Оператор, когда быстро вводит, постоянно попадал на «проглатываемые» системой буквы (ввел 3 символа, пробел — система задумывается, а оператор нажимает кнопки, которые система уже не воспринимает)
  • Второй минус — когда 1С сделала отбор, а товар закончился. Покупатель просит «дайте что-то похожее». И тогда надо очистить отбор и начинается эпопея заново.
  • Иногда полнотекстовый поиск задумывается на 1-2 секунды. А это уже очень много и сильно нервирует пользователей.

Именно поэтому решил написать быстро работающий подбор и похожий по функционалу на то, что было в 1С 7.7 — по первым буквам. У нас в базе и номенклатура именуется соответственно — по «типам», т.е. вначале наименования «предопределенные» слова: мыло, смс, м.ср., шамп и т.д.

Когда первый раз занялся этим вопросом, то все оказалось достаточно просто. До версии 8.3.8.х (если мне не изменяет память) у размещенного на форме дерева значений поиск осуществлялся как раз по первым символам наименования. Было очень удобно, работало быстро и все были счастливы.

Но по каким-то причинам, разработчики 1С закрыли эту возможность и влупили туда несчастный полнотекстовый поиск. И все опять стало плохо. Обращения к серверу, отбор списка, лишние нажатия кнопок очистки поиска и т.д.

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

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

Не могу не сказать и про минус, который есть в этой обработке. Чтобы сделать высокую скорость работы полностью убираются серверные вызовы при вводе символов и перед началом поиска создается «индекс» строк таблицы. На создание «индекса» требуется время и поэтому сделано ограничение на количество вводимых символов (чем меньше символов, тем меньше требуется времени на создание «индекса»). Методом «научного тыка» для используемой у меня конфигурации оборудования было установлено ограничение в 20 символов — на создание «индекса» 20 символов для 20+ тысяч товаров при открытии формы система тратит примерно 2 секунды. Это значение приемлемо для пользователей. У вас, возможно, при меньшей номенклатуре или более мощном компьютере (сервере) можно будет установить и большее количество индексируемых символов, но, на мой взгляд, этого количество (20 символов) вполне достаточно.

Еще один минус — использование внешней компоненты. Не помню, откуда я ее скачал (давно дело было) и кто разработчик. Компоненты, которые есть у меня в примере работают для windows (32 и 64 бита). Для других ОС не искал.

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

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

Рубрики
Примеры

Работа с файлами в 1С 8.3. Часть 2.

В предыдущей заметке я рассказал, как в 1С 8.3 выбрать файл, передать его на сервер, сохранить в базу данных, а потом извлечь обратно и сохранить обратно. Но этот рассказ будет неполным, если не дополнить его описанием с использованием асинхронных методов.

  • Выбор файла на клиенте. Создаем форму с реквизитом «ПолноеИмяФайла» и размещаем этот реквизит на форме. У поля ввода «ПолноеИмяФайла» добавляем отображение кнопки выбора и создаем соответствующий обработчик.

// Обработчик события на клиенте, в котором показываем диалог выбора файла
&НаКлиенте
Процедура ПолноеИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ДиалогВыбораФайла = ПолучитьДиалогВыбораФайла();
	
	ВыбратьФайлАсинх(ДиалогВыбораФайла);
	
КонецПроцедуры

// Получаем диалог выбора файла
&НаКлиенте
Функция ПолучитьДиалогВыбораФайла()
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	ДиалогВыбораФайла.Заголовок = "Выберите файл...";
	ДиалогВыбораФайла.Фильтр = "Изображение (*.jpg, jpeg)|*.jpg;*.jpeg|Архив (*.zip)|*.zip|Все файлы|*.*";
	
	Возврат ДиалогВыбораФайла;
	
КонецФункции

&НаКлиенте
Асинх Функция ВыбратьФайлАсинх(ДиалогВыбораФайла)
	
	ОбещаниеВыбора = ДиалогВыбораФайла.ВыбратьАсинх();
	ВыбранныеФайлы = Ждать ОбещаниеВыбора;
	ОбработатьВыборФайла(ВыбранныеФайлы);
	
КонецФункции

// Ожидаем выбор файла пользователем
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат)
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Количество() > 0 Тогда
		ПолноеИмяФайла = Результат[0];
	КонецЕсли;
	
	ПолучитьДанныеФайлаАсинх();
	
КонецПроцедуры

// Получаем информацию о файле
&НаКлиенте
Асинх Процедура ПолучитьДанныеФайлаАсинх()
	
	НайденныйФайл = ждать ПолучитьВыбранныйФайлАсинх();
	Если ТипЗнч(НайденныйФайл) = Тип("Файл") Тогда
		обРазмер = Ждать НайденныйФайл.РазмерАсинх();
		ДанныеФайла = Новый Структура("Файл, ИмяФайла, Размер, Расширение", НайденныйФайл, НайденныйФайл.Имя, обРазмер, НайденныйФайл.Расширение);
	КонецЕсли;
	
	Возврат;
	
КонецПроцедуры
  • Теперь передаем файл на сервер и сохраняем в базе данных. Для этого на форме создаем команду «ЗаписатьВБазуДанных» и размещаем соответствующую команде кнопку.

// Вызываем команду, в которой вызываем асинхронную процедуру для передачи файла на сервер
&НаКлиенте
Процедура ЗаписатьВБазуДанных(Команда)
	
	ДополнительныеПараметры = Новый Структура("ПолноеИмяФайла, ИмяФайла, Размер, Расширение", ПолноеИмяФайла, ИмяФайла, РазмерФайла, РасширениеФайла);
	ПередатьФайлНаСерверАсних(ДополнительныеПараметры);
	
КонецПроцедуры

// С использованием асинхронного метода ПоместитьФайлНаСерверАсинх передаем файл на сервер, ожидам окончания операции
&НаКлиенте
Асинх Процедура ПередатьФайлНаСерверАсних(ДополнительныеПараметры)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПрогрессПомещенияФайла", ЭтаФорма, ДополнительныеПараметры);
	ОбПомещение = ПоместитьФайлНаСерверАсинх(ОписаниеОповещения,,, ПолноеИмяФайла,);
	ПомещенныйФайл = Ждать ОбПомещение;
	ЗаписатьФайлВБазуДанных(ПомещенныйФайл.Адрес, ДополнительныеПараметры);
	
КонецПроцедуры

&НаКлиенте
Процедура ПрогрессПомещенияФайла(ПомещаемыйФайл, Помещено, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
	// Можно показать прогресс выполнения или отменить передачу
КонецПроцедуры

// Получаем данные файла из временного хранилища и записываем в заранее созданный регистр сведений
&НаСервере
Процедура ЗаписатьФайлВБазуДанных(АдресВХранилище, ДополнительныеПараметры)
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	ЗаписьРегистра = РегистрыСведений.СохраненныеФайлы.СоздатьМенеджерЗаписи();
	ЗаписьРегистра.Идентификатор = СокрЛП(Новый УникальныйИдентификатор);
	ЗаписьРегистра.ДвоичныеДанные = Новый ХранилищеЗначения(ДвоичныеДанные);
	ЗаписьРегистра.Размер = ДополнительныеПараметры.Размер;
	ЗаписьРегистра.Расширение = ДополнительныеПараметры.Расширение;
	ЗаписьРегистра.ПолноеИмяФайла = ДополнительныеПараметры.ПолноеИмяФайла;
	ЗаписьРегистра.ИмяФайла = ДополнительныеПараметры.ИмяФайла;
	ЗаписьРегистра.ДатаВремяДобавления = ТекущаяДата();
	ЗаписьРегистра.Записать(Ложь);
	
КонецПроцедуры

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

Рубрики
Примеры

Работа с файлами в 1С 8.3

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

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

  • Выбор файла на клиенте. Создаем форму с реквизитом «ПолноеИмяФайла» и размещаем этот реквизит на форме. У поля ввода «ПолноеИмяФайла» добавляем отображение кнопки выбора и создаем соответствующий обработчик.
// Обработчик события на клиенте, в котором показываем диалог выбора файла
&НаКлиенте
Процедура ПолноеИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ДиалогВыбораФайла = ПолучитьДиалогВыбораФайла();
	
	ДополнительныеПараметры = Новый Структура;
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма, ДополнительныеПараметры);
	ДиалогВыбораФайла.Показать(ОписаниеОповещения);
	
КонецПроцедуры


// Получаем диалог выбора файла
&НаКлиенте
Функция ПолучитьДиалогВыбораФайла()
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	ДиалогВыбораФайла.Заголовок = "Выберите файл...";
	ДиалогВыбораФайла.Фильтр = "Изображение (*.jpg, jpeg)|*.jpg;*.jpeg|Архив (*.zip)|*.zip|Все файлы|*.*";
	
	Возврат ДиалогВыбораФайла;
	
КонецФункции

// Обрабатываем окончание выбора файла
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, ДополнительныеПараметры) Экспорт
	ОбработатьВыборФайла(Результат);
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат)
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Количество() > 0 Тогда
		ПолноеИмяФайла = Результат[0];
	КонецЕсли;
	
	ПолучитьДанныеФайла();
	
КонецПроцедуры

// Получаем информацию о файле - имя, размер, расширение
&НаКлиенте
Функция ПолучитьДанныеФайла()
	
	Результат = Неопределено;

	Если ЗначениеЗаполнено(ПолноеИмяФайла) Тогда
		НайденныеФайлы = НайтиФайлы(ПолноеИмяФайла);
		Если НайденныеФайлы.Количество() = 1 Тогда
			Результат = НайденныеФайлы[0];
			Результат = Новый Структура("Файл, ИмяФайла, Размер, Расширение", НайденныеФайлы[0], НайденныеФайлы[0].Имя, НайденныеФайлы[0].Размер(), НайденныеФайлы[0].Расширение);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
  • Теперь передаем файл на сервер и сохраняем в базе данных. Для этого на форме создаем команду «ЗаписатьВБазуДанных» и размещаем соответствующую команде кнопку.
// Вызываем команду, в которой с помощью метода НачатьПомещениеФайлаНаСервер передаем файл на сервер
&НаКлиенте
Процедура ЗаписатьВБазуДанных(Команда)
	
	ДополнительныеПараметры = Новый Структура("ПолноеИмяФайла, ИмяФайла, Размер, Расширение", ПолноеИмяФайла, ИмяФайла, РазмерФайла, РасширениеФайла);
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайлаНаСервер", ЭтаФорма, ДополнительныеПараметры);
	НачатьПомещениеФайлаНаСервер(ОписаниеОповещения,,,, ПолноеИмяФайла,);
	
КонецПроцедуры

// Обрабатываем завершение передачи файла на сервер и вызываем процедуру записи файла в базу данных
&НаКлиенте
Процедура ПослеПомещенияФайлаНаСервер(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат.ПомещениеФайлаОтменено Тогда
		Возврат;
	КонецЕсли;
	
	ЗаписатьФайлВБазуДанных(Результат.Адрес, ДополнительныеПараметры);
	
КонецПроцедуры

// Получаем данные файла из временного хранилища и записываем в заранее созданный регистр сведений
&НаСервере
Процедура ЗаписатьФайлВБазуДанных(АдресВХранилище, ДополнительныеПараметры)
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	ЗаписьРегистра = РегистрыСведений.СохраненныеФайлы.СоздатьМенеджерЗаписи();
	ЗаписьРегистра.Идентификатор = СокрЛП(Новый УникальныйИдентификатор);
	ЗаписьРегистра.ДвоичныеДанные = Новый ХранилищеЗначения(ДвоичныеДанные);
	ЗаписьРегистра.Размер = ДополнительныеПараметры.Размер;
	ЗаписьРегистра.Расширение = ДополнительныеПараметры.Расширение;
	ЗаписьРегистра.ПолноеИмяФайла = ДополнительныеПараметры.ПолноеИмяФайла;
	ЗаписьРегистра.ИмяФайла = ДополнительныеПараметры.ИмяФайла;
	ЗаписьРегистра.ДатаВремяДобавления = ТекущаяДата();
	ЗаписьРегистра.Записать(Ложь);
	
КонецПроцедуры
  • И теперь получение файла с сервера и его сохранение на диске. В форме списка регистра сведений, в котором хранятся файлы создаем следующий код:

// Вызываем команду, в которой открываем диалог выбора файла для сохранения
&НаКлиенте
Процедура СохранитьФайл(Команда)
	
	ТекущиеДанные = Элементы.Список.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогВыбораФайла.Заголовок = "Выберите файл...";
	ДиалогВыбораФайла.Фильтр = СокрЛП(ТекущиеДанные.Расширение) + "|*" + СокрЛП(ТекущиеДанные.Расширение);
	
	ВыбратьРасположениеНаДиске(ДиалогВыбораФайла, ТекущиеДанные.Идентификатор);
	
КонецПроцедуры

// В данном примере АСИНХРОННО открываем диалог выбора, ожидаем завершения выбора и вызываем процедуру обработки
&НаКлиенте
Асинх Процедура ВыбратьРасположениеНаДиске(ДиалогВыбораФайла, Идентификатор)
	
	ОбещаниеВыбора = ДиалогВыбораФайла.ВыбратьАсинх();
	ВыбранныеФайлы = Ждать ОбещаниеВыбора;
	ОбработатьВыборФайла(ВыбранныеФайлы, Идентификатор);
	
КонецПроцедуры

// Проверяем, что выбор осуществлен, вызываем серверную функцию помещения файла во временное хранилище и вызываем метод НачатьПолучениеФайлаССервера для передачи файла с сервера на клиент и сохранения в выбранный ранее файл
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Идентификатор)
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПолноеИмяФайла = Результат[0];
	
	АдресВХранилище = ПоместитьФайлВХранилищеНаСервере(Идентификатор);
	Если ЗначениеЗаполнено(АдресВХранилище) Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ПолноеИмяФайла", ПолноеИмяФайла);
		ОписаниеОповещения = Новый ОписаниеОповещения("ПослеСохраненияФайла", ЭтаФорма, ДополнительныеПараметры);
		НачатьПолучениеФайлаССервера(ОписаниеОповещения, АдресВХранилище, ПолноеИмяФайла);
	КонецЕсли;
	
КонецПроцедуры

// На сервере получаем данные из регистра сведений и помещаем их во временное хранилище
&НаСервере
Функция ПоместитьФайлВХранилищеНаСервере(Идентификатор)
	
	ЗаписьРегистра = РегистрыСведений.СохраненныеФайлы.СоздатьМенеджерЗаписи();
	ЗаписьРегистра.Идентификатор = Идентификатор;
	ЗаписьРегистра.Прочитать();
	
	АдресВХранилище = ПоместитьВоВременноеХранилище(ЗаписьРегистра.ДвоичныеДанные.Получить());
	
	Возврат АдресВХранилище;
	
КонецФункции

// Показываем пользователю сообщение о завершении операции
&НаКлиенте
Процедура ПослеСохраненияФайла(Результат, ДополнительныеПараметры) Экспорт
	
	ПоказатьПредупреждение(, "Сохранен файл " + СокрЛП(ДополнительныеПараметры.ПолноеИмяФайла));
	
КонецПроцедуры

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

Рубрики
Пожелания к 1С

Регламентные задания в 1С 8.3. Пожелания к разработчикам платформы.

Сегодня пойдет речь об очень полезном механизме в 1С 8.3 — Регламентных заданиях.

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

  • выгрузка-загрузка данных в другие системы (другие учетный системы, сайта, кассы и т.д.)
  • пересчеты вспомогательных данных, используемых при заполнении документов
  • «отложенное» проведение документов — когда в режиме реального времени делаем проводки по основным регистрам (остатки товаров, взаиморасчеты), а вспомогательные (аналитические) можно сделать и в фоновом режиме минут через 10-15-20
  • другие варианты — зависит от конкретных задач и фантазии

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

  • Для регламентных заданий (или в расписание), добавить свойство «Не выполнять пропущенные». Например: есть регламентное задание, которое должно выполняться ежедневно в 01:00. По каким-либо причинам оно не было выполнено (проводились технические работы и сервер был физически выключен в это время). При запуске сервера в 02:00, это задание выполняется. Но такое «позднее» выполнение требуется далеко не всегда.
  • Сделайте возможность добавлять новые задания без изменения конфигурации. Вариант создания нового задания на основании существующего — не вариант, т.к. невозможно переопределить запускаемую процедуру. Использовать методы обхода через внешние обработки, запускаемые по расписанию — не очень красиво и не всегда удобно.
  • В продолжение предыдущего пункта — сделать нормальный, быстро работающий интерфейс управления заданиями из 1С:Предприятия через «Функции для технического специалиста -> Стандартные». Текущая обработка в стандартных конфигурациях работает медленно. Плюс сюда можно добавить и возможность добавления новых регламентных заданий.

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

Рубрики
Пожелания к 1С

Очередной камень в огород 1С

Эта заметка о наболевшем, как очередной крик «Почему так?» от программиста, работающего с несколькими типовыми конфигурациями (Управление торговлей, Бухгалтерия, ЗУП) и самописной с использованием БСП.

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

Вопрос — куда смотрят архитекторы в 1С? Как допустили такой бардак в типовых решениях?

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

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

Отдельным блоком в этом хаосе стоят разночтения в наименовании объектов в типовых решениях. Без обмена данными между различными конфигурациями никуда, но на вопрос почему в Управлении торговлей документ называется «ПриобретениеТоваровУслуг», а в Бухгелтерии — «ПоступлениеТоваровУслуг» я не могу дать хоть сколько-нибудь здравого ответа. Почему в Управлении торговлей — «Договор», а в Бухгалтерии — «ДоговорКонтрагента»? В Управлении торговлей — «ВозвратТоваровОтКлиента», а в Бухгалтерии — «ВозвратТоваровОтПокупателя»? Зато «ВозвратТоваровПоставщику» — одинаково. Где логика? Из-за всех таких разночтений ловишь кучу проблем при написании обменов между базами. Здесь мы говорим так, а за углом — так, а завтра — по-другому.

Пожалуйста, будь здравыми людьми. Пожалейте простых программистов 1С. Сделайте дерево подсистем и единообразные наименования. Это возможно.

Рубрики
1С 8.3 и не только

Год спустя

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

Плюсы после перехода:

  1. Работать стало лучше, работать стало веселей. Надо отдать должное, 8.3 для пользователей работает гораздо шустрее, чем 7.7. Документы проводятся быстрее, про построение отчетов и говорить бессмысленно — на порядок быстрее написать нормальный запрос и вывести данные, а не пользоваться тупыми переборами таблиц 7.7 (прямые запросы в семерке все равно медленнее).
  2. Очень радуют по сравнению с семеркой возможности настройки интерфейса для пользователя — раскраски ячеек, объединения колонок, произвольные динамические списки и прочее, прочее, прочее. Можно сделать удобный и наглядный интерфейс, хотя, надо признаться, этому моменту уделяю не так много времени. В приоритете стоит вопрос — как проверить корректность ввода, сделать так, чтобы вводить поменьше данных, чтобы ускорить работу пользователя.
  3. Отдельно стоит сказать про возможности «отложенного» проведения документов по регистрам, когда в режиме реального времени делаются только основные движения (например, списываются остатки товаров со склада), а потом регламентным заданием делаем вспомогательные движения (продажи, затраты и прочие). Это особенно заметно сказывается на скорости работы при пакетном формировании большого количества документов подряд.
  4. Наконец-то регламентные задания выполняются точно по расписанию. Не надо делать дурацкие задачи на запуск 1С каким-нибудь планировщиком ночью, чтобы выполнить обработки и автоматически сформировать документы, произвести расчеты.
  5. Естественно, нельзя не упомянуть про встроенные в платформу возможности по работе с электронной почтой, интернет соединениями, возможностями по обмену данными в различный форматах и т.д. Плюшек много, писать кода надо гораздо меньше и не используя внешние компоненты.

И ложка дегтя в бочке меда:

  1. Непродуманный и кривоватый полнотекстовый поиск. Настроить его для работы даже на оценку «Хорошо» у меня не получилось. Максимум — «Удовлетворительно», а если трезво оценивать — между «Очень плохо» и «Плохо». Поиск медленный и для быстрой работы не подходит. Если чуть-чуть переборщить в списке с количеством полей, по которым осуществляется поиск, то он длится 3-5-10 и более секунд в списке документов из 200тыс строк. Если список небольшой, то ищет быстро, но недостаточно — сказывается существенная (около 0.05-0.1 секунды) потеря на передаче информации между клиентом и сервером. Поэтому в списке товаров при подборе в документ (когда покупатель «на телефоне»), где надо быстро искать нужный товар, пришлось написать свою обработку, отказавшись от стандартного поиска.
  2. Ошибки в платформе, о которых я рассказывал ранее (и буду рассказывать в дальнейшем). На выявление и обход иногда тратится большое количество времени. Все-таки семерка была отлажена и работала корректно в пределах своих возможностей, а тут 1С пытается добавить большое количество новых возможностей (востребованность которых иногда под очень большим вопросом), и, как обычно, все вместе получается сыровато и кривовато. А проблемы появляются у конечных пользователей и программистов, когда сама фирма 1С тихо сидит в сторонке и пополняет список выявленных ошибок. В то время, как за эти ошибки платят, опять же, конечные пользователи.
Рубрики
Пожелания к 1С

Идея №4 улучшения для платформы 1С

Продолжаю подкидывать идеи фирме «1С» по улучшению платформы 1С:Предприятие. Сегодня пройдусь по «Подсистемам». Задумка хорошая, но реализация, как обычно, подкачала. Очень сильно подкачала. На мой взгляд, в том виде, как есть сейчас «Подсистемы» в 1С — пустое место. Пользоваться неудобно и бессмысленно (только ради отображения в интерфейсе).

Для начала надо… создать (вернуть, т.к. это было в ранних версиях 1С8.0 и 1С8.1) отдельный раздел «Интерфейс», который и будет, собственно, основой меню, интерфейса пользователя. Здесь у нас остается такая функция как «Командный интерфейс», в которой можно задать последовательность, видимость, доступность и т.д. тех или иных команд пользователю. По сути, мы возвращаемся к тому, что было в 7.7 и 8.0 (8.1) — был отдельный раздел «Интерфейсы», в котором описывались доступные пользователю пункты меню. Эти интерфейсы можно было включить в ту или иную подсистему. И это верный, логичный подход. Я до сих пор не понимаю, почему отказались от этого раздела. Ведь сейчас получается полная ерунда — в подсистему включается куча справочников, документов, но они не отображаются в интерфейсе. Зачем это надо?

А теперь описание того, чего не хватает в реализации подсистем. Здесь у меня «хотелок» гораздо больше.

  1. Убрать из подсистем «Командный интерфейс» — т.к. интерфейс должен описываться отдельно (смотри выше).
  2. Добавить в подсистему свойство «Номер версии». Необходимо как воздух.
  3. Добавить для подсистем свойство с возможностью выбора множества значений «Зависит от подсистем». В этом свойстве разработчик должен выбирать другие подсистемы, необходимые для работы текущей, а также указывать минимальный номер версии «ведущей» подсистемы, с которой можно работать (т.к. не все зависимости можно выстроить по простой иерархии). Получится, что платформа сможет отслеживать наличие всех требуемых подсистем в конфигурации и соответствуют ли их версии. Как пример — указывать, что для подсистемы «Присоединенный файлы» необходимы подсистема «Базовая функциональность» версии 2.1.4 и «Работа с файлами» версии «1.6.2» и если эти требования не выполняются, то, например, функционал данной подсистемы недоступен для пользователя (или вообще невозможно запустить приложение). Есть сложность — при задании свойства необходимо отслеживать указанную зависимость на наличие «кольца», чтобы не получилось, что для «подсистемы 1» нужна «подсистема 2», для «подсистемы 2» — «подсистема 3», а для «подсистемы 3» — «подсистема 1».
  4. Для каждой подсистемы сделать предопределенные модули (как «Модуль менеджера» или «Модуль объекта») по типам модулей. Модуль «Клиент», «Сервер», «КлиентСервер», «ПовторныйВызов» (хотя бы на время сеанса). Плюсы этого подхода — модули сразу привязаны к подсистеме и открываются из окна свойств (что удобно), у нас очень сильно уменьшится список «Общие модули» (сейчас он получается очень большой и неудобно искать нужный модуль). А также добавить модуль «ОбновлениеПодсистемы», в котором должна быть предопределенная процедура «ОбновлениеВерсии», вызываемая автоматически при запуске программы, если — читай следующий пункт. Порядок вызова процедур обновления должен соответствовать зависимостям подсистем (пункт 3).
  5. Добавить в подсистему свойство «Номер рабочей версии». Это свойство невозможно установить в конфигураторе, а только вызвав в коде какую-нибудь процедуру «УстановитьНомерВерсииПодсистемы». С помощью этого свойства можно автоматически отслеживать версии и запускать процедуру обновления (смотри пункт 4).

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

Рубрики
Пожелания к 1С

Идея №3 улучшения для платформы 1С

Разработчикам платформы 1С накидываю идею №3 для повышения удобства разработки на платформе.

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

Описание моего предложения:

  1. Добавить в платформу предопределенный справочник «Объекты метаданных» (этот справочник в типовых конфигурациях создается и заполняется ручками на уровне кода в 1С). В справочнике автоматически при обновлении конфигурации создаются/изменяются данные по объектам (добавлять/удалять записи «ручками» запрещено) — справочникам, документам, перечислениям, отчетам и т.д. Справочник, естественно, иерархический.
  2. В каждом ссылочном объекте метаданных должна быть ссылка на этот предопределенный справочник (чтобы можно было получить ссылку на справочник «Объекты метаданных», как говорится «через точку»). Это нужно, чтобы не вызывать метод Метаданные() для ссылки/объекта, не использовать в запросах конструкцию вида «.Ссылка Документ.ПоступлениеТоваровУслуг».
  3. Добавить возможность добавления реквизитов в справочник «Объекты метаданных» разработчиком конфигурации, причем значения надо задавать так же в конфигураторе (пожелание о задании реквизитов для предопределенных элементов я описывал ранее). Данная возможность упростит жизнь разработчикам. Можно разделить объекты по принадлежности к какой-либо операции, задать наименования реквизитов (если в разных объектах они имеют различные наименования типа «Организация» и «ОрганизацияОтправитель»)
  4. Соответственно, этот предопределенный справочник можно использовать в запросах, должно быть легко делать соединение прикладных объектов с этим справочником, чтобы в запросе легко можно было получить значения заданных разработчиком реквизитов и т.д.

Пожалуйста, подумайте над этим предложением. В этом что-то есть.

Рубрики
Пожелания к 1С

Пожелание номер два — Перечисления

Уважаемые разработчики платформы 1С! Очередное пожелание по доработке платформы 1С.

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

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

Все равно в структуре базы данных перечисление записывается в отдельную таблицу (как и справочник).

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

А подумайте, как удобно стало бы программистам 1С. Например, в перечисление «Ставки НДС» добавить реквизит «Процент ставки» и использовать его в запросах для пересчета сумм, а не писать лишние процедуры типа «ПолучитьСтавкуНДС» и делать построчный обход.

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

Рубрики
Пожелания к 1С

Пожелания к разработчикам 1С

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

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

В справочниках 1С 8.х появилась замечательная возможность, которой очень сильно не хватало в 1С7.7 — предопределенные элементы. Эта штука сама по себе очень удобна для многих моментов, но ПОЧЕМУ при создании предопределенного элемента можно задать ТОЛЬКО Код и Наименование?

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

В качестве бонуса, при реализации этой задачи для каждого реквизита каждого предопределенного элемента справочника можно добавить признак — можно или нет его изменять интерактивно (или програмно) в системе 1С:Предприятие.

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