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

Программирование - Практика программирования

В типовых конфигурациях платформы "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);
ПолучитьРеквизитыДоговора(НаименованиеДоговора, НомерДоговора, ДатаДоговора);

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

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

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

См. также

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