gifts2017

Как получить номер и дату договора из наименования справочника договоров?

Опубликовал Алексей Ситников (SiAl) в раздел Программирование - Практика программирования

В типовых конфигурациях платформы "1С:Предприятие 7.7" часто номер и дата договора указаны в самом наименовании договора. Что создает сложности в тех случаях, когда эти реквизиты надо знать, например, при конвертации данных в конфигурации платформы "1С:Предприятие 8", где номер и дата договора - отдельные реквизиты.

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

Процедура ПолучитьРеквизитыДоговора(Знач Договор, НомерДог, ДатаДог)
	// Если название договора пустое, то выход
	Если ПустоеЗначение(Договор) = 1 Тогда
		Возврат;
	КонецЕсли;
	Гг = 0; Мм = 0; Дд = 0;
	// Создадим объект для использования регулярных выражений
	RegExp = CreateObject("VBScript.RegExp");
	// Найдем в наименовании договора нужные нам значения
	RegExp.Pattern = "(№\s*(\S+))?\s*от\s*(\d{1,2})\D(\d{1,2})\D(\d{1,4})";
	RegExp.IgnoreCase = -1;
	Matches = RegExp.Execute(Договор);
	Если Matches.Count = 1 Тогда
		// Подстрока поиска в названии договора найдена
		Match = Matches.Item(0);
		Если Match.SubMatches.Count = 5 Тогда
			// Получим номер договора
			НомерДог = СокрЛП(Match.SubMatches.Item(1));
		КонецЕсли;
		// Найдем значения года, месяца и дня в цифровом виде
		Дд = Число(Match.SubMatches.Item(Match.SubMatches.Count - 3));
		Мм = Число(Match.SubMatches.Item(Match.SubMatches.Count - 2));
		Гг = Число(Match.SubMatches.Item(Match.SubMatches.Count - 1));
	КонецЕсли;
	// Если не указано столетие, то укажем текущее
	Если (Гг > 0) И (Гг < 100)  Тогда
		Гг = Гг + Цел(ДатаГод(ТекущаяДата()) / 100) * 100;
	КонецЕсли;
	// Проверим и преобразуем нужные нам значения
	ДатаДог = Дата(Гг, Мм, Дд);
	Если ПустоеЗначение(НомерДог) = 1 Тогда
		// Для ненайденного номера договора устанавливаем значение "без номера"
		НомерДог = "б/н";
	КонецЕсли;
КонецПроцедуры // ПолучитьРеквизитыДоговора

Поиск осуществляется с помощью встроенной в ОС Microsoft Windows компоненты RegExp. Шаблон поиска реквизитов подразумевает следущий шаблон:

№[Номер]от[Дата]

, где между ключевыми словами "№" и "от" и значениями реквизитов могут быть любое количество пробелов. Поиск осуществляется вне зависимости от регистра ключевого слова "от" ("ОТ", "От", "оТ").

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

НомерДоговора = ""; ДатаДоговора = Дата(0);
ПолучитьРеквизитыДоговора(НаименованиеДоговора, НомерДоговора, ДатаДоговора);

Попробовать процедуру можно в тестовой обработке.

Скачать файлы

Наименование Файл Версия Размер
Пример получения реквизитов договора 2
.ert 113,00Kb
24.09.15
2
.ert 1.0 113,00Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Даниил Матвеев (cargobird) 25.09.15 08:21
Доброго времени!
На главной странице сайта стоимость скачивания файла 10$m, а внутри публикации 1$m.
Если хотите привести в соответствие - в поле "минимальная стоимость публикации" при редактировании публикации тоже надо указать 1$m...
2. Дониэла Иванова (Доня) 25.09.15 12:34
а если номер сложный: с буквами и цифрами ?
3. Алексей Ситников (SiAl) 25.09.15 14:07
(2) Доня, без разницы. Все что между "№" и "от" считается номером (конечно без окружающих пробелов). И в описании забыл написать, что если "№" в наименовании был не найден, то тогда считается, что номера нет. Пришлось на это пойти, чтобы в номер не "пихалась" всякая лабуда.
4. Алексей Ситников (SiAl) 25.09.15 14:10
(1) cargobird, хорошо, сейчас исправлю. А то уже лет сто ничего тут не выкладывал, тонкостей не знаю / не помню.
5. Leja Leja (Leja) 01.10.15 11:04
найти "№" и "от" в строке уже не катит?
6. Алексей Ситников (SiAl) 02.10.15 15:10
(5) Leja, катит. Только в моем случае, одной строкой регулярного выражения я могу найти номер, или не найти - при его отсутствии, а также у меня может быть число символов числа и месяца от одного до двух, а для года - от одного до четырех, с любыми нечисловыми разделителями: хоть точка, хоть запятая, хоть слэш, да что угодно.
Сколько бы кода, используя функцию Найти(), пришлось бы писать? А еще бы было пришлось писать кучу условий Если ... Тогда и функций Сред(), Лев() и Прав().
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа