Добро пожаловать,
Поиск
В пособии рассматривается технология ведения бухгалтерского и налогового учета в программе "1С:Бухгалтерия 8". Большое внимание уделено подготовке программы к эксплуатации, документообороту, организации и технологии ведения учета на отдельных участках, обобщению учетных данных и формированию результатной информации для внутренних и внешних пользователей. Иллюстративный материал основан на редакции 1.5 типовой конфигурации "Бухгалтерия предприятия". Пособие ориентировано на бухгалтеров - пользователей программы "1С:Бухгалтерия 8", специалистов по внедрению, преподавателей и студентов, изучающих информационные технологии бухгалтерского учета. Пособие может быть полезно для организации учебных курсов по бухгалтерскому учету в среде "1С:Предприятие 8". Данная книга дополняет, но не заменяет штатную документацию к программам системы "1С:Предприятие 8", входящую в комплект поставки, и позволяет более эффективно использовать возможности программы.
Лазерные диски – не слишком-то надежные носители информации. Даже при бережном обращении с ними вы не застрахованы от появления царапин и загрязнения поверхности (порой диск фрезерует непосредственно сам привод и вы бессильны этому противостоять). Но даже вполне нормальный на вид диск может содержать внутренние дефекты, приводящие к его полной или частичной нечитаемости на штатных приводах. Особенно это актуально для CD-R/CD-RW дисков, качество изготовления которых все еще оставляет желать лучшего, а процесс записи сопряжен с появлением различного рода ошибок. Однако даже при наличии физических разрушений поверхности лазерный диск может вполне нормально читаться за счет огромной избыточности хранящихся на нем данных, но затем, по мере разрастания дефектов, корректирующей способности кодов Рида-Соломона неожиданно перестает хватать, и диск безо всяких видимых причин отказывается читаться, а то и вовсе не опознается приводом.
К счастью, в подавляющем большинстве случаев хранимую на диске информацию все еще можно спасти, и эта статья рассказывает как.
Общие рекомендации по восстановлению
Не всякий не читающийся (нестабильно читающийся) диск – дефектный. Зачастую в этом виновен отнюдь не сам диск, а операционная система или привод. Прежде чем делать какие-либо заключения, попробуйте прочесть диск на всех доступных вам приводах, установленных на компьютерах девственно-чистой операционной системой. Многие приводы, даже вполне фирменные и дорогие (например, мой PHILIPS CD-RW 2400), после непродолжительной эксплуатации становятся крайне капризными и раздражительными, отказывая в чтении тем дискам, которые все остальные приводы читают безо всяких проблем. А операционная система по мере обрастания свежим софтом склонна подхватывать различные глюки подчас проявляющиеся самым загадочным образом (в частности, привод TEAC, установленный в систему с драйвером CDR4_2K.SYS, доставшемся ему в наследство от PHILIPS'a, конфликтует с CD Player'ом, не соглашаясь отображать содержимое дисков с данными, если тот активен, после удаления же CDR4_2K.SYS все идет как по маслу).
Также не стоит забывать и о том, что корректирующая способность различных моделей приводов очень и очень неодинакова. Как пишет инженер-исследователь фирмы ЕПОС Павел Хлызов в своей статье "Проблема: неисправный CD-ROM": "…в зависимости от выбранной для конкретной модели CD-ROM стратегии коррекции ошибок и, соответственно, сложности процессора и устройства в целом, на практике тот или иной CD-ROM может либо исправлять одну-две мелкие ошибки в кадре информации (что соответствует дешевым моделям), либо в несколько этапов восстанавливать, с вероятностью 99,99%, серьезные и длинные разрушения информации. Как правило, такими корректорами ошибок оснащены дорогостоящие модели CD-ROM. Это и есть ответ на часто задаваемый вопрос: "Почему вот этот диск читается на машине товарища, а мой ПК его даже не видит?".
Вообще-то, не совсем понятно, что конкретно господином инженером-исследователем имелось ввиду: корректирующие коды C1, C2, Q- и P- уровней корректно восстанавливают все известные мне приводы, и их корректирующая способность равна: до двух 2 ошибок на каждый из C1 и C2 уровней и до 86- и 52-ошибок на Q- и P- уровни соответственно. Правда, количество обнаруживаемых, но уже математически неисправимых ошибок составляет до 4 ошибок на C1 и C2 уровней и до 172/104 ошибок на Q/P, но… гарантированно определяется лишь позиция сбойных байт во фрейме/секторе, а не их значение. Впрочем, зная позицию сбойных байт и имея в своем распоряжении исходный HF-сигнал (т. е. аналоговый сигнал, снятый непосредственно со считывающей головки), кое-какие крохи информации можно и вытянуть, по крайней мере теоретически… так что приведенная выше цитата в принципе может быть и верна, однако, по наблюдениям автора данной статьи, цена привода очень слабо коррелирует с его "читабельной" способностью. Так, относительно дешевые ASUS читают практически все, а дорогие PHILIPS'ы даже свои родные диски с драйверами опознают через раз.
Другая немаловажная характеристика – доступный диапазон скоростей чтения. В общем случае – чем ниже скорость вращения диска, тем мягче требования, предъявляемые к его качеству. Правда, зависимость эта не всегда линейна. Большинство приводов имеют одну или несколько наиболее предпочтительных скоростей вращения, на которых их читабельная способность максимальна. Например, на скорости 8x дефектный диск читается на ура, а на всех остальных скоростях (скажем, 2x, 4x, 16x, 32x) – не читается вообще. Предпочтительная скорость легко определяется экспериментально, необходимо лишь перебрать полный диапазон доступных скоростей.
При покупке CD-ROM'a выбирайте тот привод, у которого скоростной диапазон максимален. Например, уже упомянутый выше PHILIPS CDRW 2400 умеет работать лишь на: 16x, 24x, 38x и 42x. Отсутствие скоростей порядка 4x – 8x ограничивает "рацион" привода только высококачественными дисками.
По непонятным причинам, штатные средства операционной системы Windows не позволяют управлять скоростью диска и потому приходится прибегать к помощи сторонних утилит, на недостаток которых, впрочем, жаловаться не приходится. Вы можете использовать Slow CD, Ahead Nero Drive Speed и т. д. Вообще-то, большинство приводов самостоятельно снижают скорость, натолкнувшись на не читающиеся сектора, однако качество заложенных в них алгоритмов все еще оставляет желать лучшего, поэтому "ручное" управление скоростью дает значительно лучший результат.
Если же ни на одном из доступных вам приводов диск все равно не читается, можно попробовать отшлифовать его какой-нибудь полировальной пастой. Технике полирования оптических поверхностей (и лазерных дисков в частности) посвящено огромное количество статей, опубликованных как в печатных изданиях, так и в Интернете (особенно полезны в этом смысле астрономические книги по телескопостроению), поэтому здесь этот вопрос будет рассмотрен лишь кратко. Да, действительно, поцарапанный диск в большинстве случав можно отполировать, и если все сделать правильно, диск с высокой степенью вероятности возвратится из небытия, но… Во-первых, полировка восстанавливает лишь царапины нижней поверхности диска и бессильна противостоять разрушениям отражающего слоя. Во-вторых, устраняя одни царапины, вы неизбежно вносите другие - после иной полировки лазерному диску может очень сильно поплохеть. В-третьих, полировке дисков невозможно научиться за раз, – вам понадобиться уйма времени и куча "подопытных" дисков. Нет уж, благодарю покорно! Лучше мы пойдем другим путем!
А вот что вашему диску действительно не помешает – так это протирка обычными салфетками, пропитанными антистатиком (ищите их в компьютерных магазинах). Прежде чем вытирать диск, сдуйте все частицы пыли, осевшие на него (иначе вы его только больше поцарапаете) и ни в коем случае не двигайтесь концентрическими мазками! Вытирать поверхность диска следует радиальными движениями от центра к краям, заменяя салфетку на каждом проходе.
Системы Windows XP имеют в своем составе простейший брандмауэр подключения к Интернету (Internet Connection Firewall, ICF) — программу, позволяющую фильтровать информацию, поступающую из Интернета. Она пропускает только разрешенные ТСР/IР-пакеты и отбрасывает все осталь-ные. Это позволяет оградить компьютер от несанкционированного доступа или атак из Интернета, сохраняя при этом возможность работы с электрон-ной почтой, сетью Веб и т. п. Брандмауэр должен устанавливаться на подключении, которое непосредственно связано с Интернетом. Например, его рекомендуется ставить на компьютер, имеющий общее подключение к Интернету (Internet Connection Sharing, ICS). (Этого делать не нужно, если в локальной сети уже имеется прокси-сервер или корпоративный брандмауэр.) Включение локального брандмауэра (никакой установки по сути-то и нет) выполняется на вкладке Дополнительно (Advanced) в окне, свойств выбранного подключения (обычно коммутируемого). Достаточно установить флажок Защитить мое подключение к Интернету (Protect my computer and network), и бранд-мауэр начнет работать.
Теперь нужно указать, к каким службам локального компьютера или сети можно обращаться из Интернета. Если подключение используется только для доступа к веб-ресурсам и электронной почте, то после включения брандмауэр уже готов к работе. Однако, если на компьютере разрешены входящие или VPN-подключения, настройка служб необходима. В этом случае система предлагает по умолчанию установки брандмауэра; в данном примере используется обычное коммутируемое подключение через аналоговый модем. Кроме того, при работе программы Windows Messenger в приведенном списке служб автоматически появляются порты TCP и UDP, нужные для ее работы.
Понятно, что если на компьютере или в локальной сети имеется FTP- или WWW-сервер, то нужно отметить эти службы на вкладке Службы (Services), чтобы с ними можно было работать. Выбрав службу и нажав кнопку Изме-нить (Edit), можно попасть в окно настройки ее параметров, где указывается адрес компьютера, на котором служба развернута, и номера используемых портов TCP/IP.
Не рекомендуется ставить брандмауэр на локальных и VPN-подключениях, поскольку это нарушит доступ к общим ресурсам. Особого внимания заслуживает трафик, передающийся по протоколу Internet Control Message Protocol (ICMP). По умолчанию он весь блокируется брандмауэром. Это означает, что, например, ping-запросы к вашему ком-пьютеру будут безрезультатными. Иногда блокировка ICMP может привести к разрыву связи с интернет-провайдером. При необходимости на вкладке ICMP можно разрешить некоторые виды ICMP-сообщений; информацию об используемых запросах следует получить у провайдера, В крайнем случае, можно разрешить все запросы и посмотреть, повлияло ли это на устойчивость связи.
Вся работа брандмауэра регистрируется в журнале, параметры которого задаются на вкладке Ведение журнала безопасности (Security Logging).
Разместил: dxdxd
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
* Обработка значений
* Форматирование
* Список значений
* Таблица значений
* Таблица
* Период и дата
* Календари и праздники
* Справочники
* Документы
* Предопределённые функции
* Налоговый учёт
Обработка значений в 1С
Код //функция проверяет, является ли переданный в функцию Символ числом
Функция ЭтоЧисло(Символ) Экспорт
Если (КодСимв(Символ)>=48) И (КодСимв(Символ)<=57) Тогда
Возврат(1);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
//функция возвращает копейки
Функция гКопейки(Значение) Экспорт
Грн=Цел(Значение);
Коп=Значение-Грн;
Возврат(Коп
0);
КонецФункции
//функция возвращает сумму без скидки
Функция гСкидка(Сумма,Скидка) Экспорт
Возврат Сумма*(1-Скидка/100);
КонецФункции
//функция устанавливает новое значение реквизита документа или справочника и задаёт вопрос, если новое значение не соответствует предыдущему
Функция гЗначение(Ко,Атрибут,Значение) Экспорт
Знач1=Ко.ПолучитьАтрибут(Атрибут);
Знач2=Значение;
//проверка
Если Не(ТипЗначенияСтр(Знач1)=ТипЗначенияСтр(Знач2)) Тогда
//несоответствие типов
Возврат(0);
ИначеЕсли Не(ТипЗначенияСтр(Знач2)="Число") И (ПустоеЗначение(Знач2)=1) Тогда
//пустое новое значение
Возврат(0);
КонецЕсли;
//реквизит
Если Метаданные.Документ(Ко.Вид()).Выбран()=1 Тогда
//документ
Если Метаданные.Документ(Ко.Вид()).РеквизитШапки(Атрибут).Выбран()=1 Тогда
Ж=Метаданные.Документ(Ко.Вид()).РеквизитШапки(Атрибут);
Имя=Ж.Представление();
ИначеЕсли Метаданные.Документ(Ко.Вид()).РеквизитТабличнойЧасти(Атрибут).
Выбран()=1 Тогда
Ж=Метаданные.Документ(Ко.Вид()).РеквизитТабличнойЧасти(Атрибут);
Имя=Ж.Представление()+" (строка "+Ко.НомерСтроки+")";
Иначе
Ж=Метаданные.ОбщийРеквизитДокумента(Атрибут);
Имя=Ж.Представление();
КонецЕсли;
ИначеЕсли Метаданные.Справочник(Ко.Вид()).Выбран()=1 Тогда
//справочник
Ж=Метаданные.Справочник(Ко.Вид()).Реквизит(Атрибут);
Имя=Ж.Представление();
Если ПустаяСтрока(Имя)=1 Тогда
Имя=Атрибут;
КонецЕсли;
КонецЕсли;
//форматирование
Если ТипЗначенияСтр(Знач2)="Строка" Тогда
Знач1=СокрЛП(Знач1);
Знач2=СокрЛП(Знач2);
ИначеЕсли ТипЗначенияСтр(Знач2)="Число" Тогда
Знач2=Окр(Знач2,Ж.Точность);
КонецЕсли;
//проверка
Если Знач1=Знач2 Тогда
Возврат(0);
КонецЕсли;
//установка значения
Если ПустоеЗначение(Знач1)=0 Тогда
Текст=
"Атрибут: "+Имя+"
|
|Старое значение: "+СимволТабуляции+Знач1+"
|Новое значение: "+СимволТабуляции+Знач2+"
|
|Установить новое значение?";
Если Вопрос(Текст,"Да+Нет")="Нет" Тогда
Возврат(0)
КонецЕсли;
КонецЕсли;
//значение
Ко.УстановитьАтрибут(Атрибут,Знач2);
Возврат(1);
КонецФункции
Форматирование данных в 1С
Код //форматирование числа
Функция гЧисло(Значение,Знаки=2) Экспорт
Ответ=Формат(Значение,"Ч18."+Знаки);
Возврат СокрЛП(Ответ);
КонецФункции
//функция убирает лишние пробелы
Функция гСжатьПробелы(аТекст) Экспорт
Текст=СокрЛП(аТекст);
//пробелы
Замена=Формат(" ","С5");
Для й=1 По 4 Цикл
Знак=Сред(Замена,й);
Текст=СтрЗаменить(Текст,Знак," ");
КонецЦикла;
//
Возврат СокрЛП(Текст);
КонецФункции
//функция возвращает переданную строку, в которой первая буква устанавливается в верхнем или в нижнем регистре
Функция гБуква(Текст,ФлагНрег=0) Экспорт
Буква=Лев(Текст,1);
Если ФлагНрег=0 Тогда
Буква=ВРег(Буква);
Иначе
Буква=НРег(Буква);
КонецЕсли;
Возврат(Буква+Сред(Текст,2));
КонецФункции
/функция возвращает представление переданного документа
Функция гПредставлениеДокумента(Д) Экспорт
Возврат Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок)+" ("+Д.ДатаДок+")";
КонецФункции
//процедура выдаёт сообщение при проведении документа
Процедура гСообщить(Ко,Текст,НомерСтроки=0,Символ="!") Экспорт
//сигнал
Если Ко.Ошибка=0 Тогда
Сигнал();
КонецЕсли;
//документ
Документ=""+Ко.ДатаДок+" "+Ко.ПредставлениеВида()+" "+СокрЛП(Ко.НомерДок);
//номер строки
Если НомерСтроки>0 Тогда
Документ=Документ+" (строка "+НомерСтроки+")";
КонецЕсли;
//сообщение
Сообщить(Документ+": "+Текст,Символ);
КонецПроцедуры
Список значений в 1С
Код //процедура выполняется при добавлении нового значения в интерактивный список значений
Процедура сзДобавить(Список,Тип,Вид,Длина,Точность,Подсказка) Экспорт
//тип
Если (Тип="Справочник") Или (Тип="Документ") Тогда
Тип=Тип+"."+Вид;
КонецЕсли;
//значение
Если Список.ТекущаяСтрока()=0 Тогда
Значение="";
Иначе
Значение=Список.ПолучитьЗначение(Список.ТекущаяСтрока());
КонецЕсли;
//выбор
Если ВвестиЗначение(Значение,Подсказка,Тип,Длина,Точность)=1 Тогда
Список.ДобавитьЗначение(Значение);
КонецЕсли;
КонецПроцедуры
//процедура выполняется для изменения значения интерактивного списка значений
Процедура сзИзменить(Список) Экспорт
Позиция=Список.ТекущаяСтрока();
Если Позиция=0 Тогда
Возврат;
КонецЕсли;
//
Значение=Список.ПолучитьЗначение(Список.ТекущаяСтрока());
Тип=ТипЗначенияСтр(Значение);
Если (Тип="Справочник") Или (Тип="Документ") Тогда
Тип=Тип+"."+Значение.Вид();
Подсказка=Значение.Вид();
Иначе
Подсказка=Тип;
КонецЕсли;
Если ВвестиЗначение(Значение,Подсказка,Тип)=1 Тогда
Список.УстановитьЗначение(Позиция,Значение);
КонецЕсли;
КонецПроцедуры
//процедура выполняется при удалении значения из интерактивного списка значений
Процедура сзУдалить(Список) Экспорт
Если Список.ТекущаяСтрока()>0 Тогда
Список.УдалитьЗначение(Список.ТекущаяСтрока());
КонецЕсли;
КонецПроцедуры
//процедура изменяет позицию значения интерактивного списка значений
Процедура сзСдвинуть(Список,Количество) Экспорт
Если (Количество>0) И (Список.ТекущаяСтрока()=Список.РазмерСписка()) Тогда
Количество=1-Список.РазмерСписка();
ИначеЕсли (Количество<0) И (Список.ТекущаяСтрока()=1) Тогда
Количество=Список.РазмерСписка()-1;
КонецЕсли;
Список.СдвинутьЗначение(Количество,Список.ТекущаяСтрока());
КонецПроцедуры
//функция проверяет наличие в списке значений с пометками хотя бы одного помеченного значения
Функция сзПометка(Список) Экспорт
Для i=1 По Список.РазмерСписка() Цикл
Если Список.Пометка(i)=1 Тогда
Возврат(1);
КонецЕсли;
КонецЦикла;
//нет пометок
Возврат(0);
КонецФункции
//функция помечает или снимает пометку для всех значений списка
Процедура сзПометить(Список,Флаг) Экспорт
Для й=1 По Список.РазмерСписка() Цикл
Список.Пометка(й,Флаг);
КонецЦикла;
КонецПроцедуры
//процедура оставляет в списке значений заданное количество значений
Процедура сзОбрезать(Список,Размер) Экспорт
Если Список.РазмерСписка()>Размер Тогда
Количество=Список.РазмерСписка()-Размер;
Список.УдалитьЗначение(Размер+1,Количество);
КонецЕсли;
КонецПроцедуры
//функция выгружает значения колонки таблицы значений в список значений
Функция сзКолонка(М,Колонка) Экспорт
Список=СоздатьОбъект("СписокЗначений");
//
В=СоздатьОбъект("ТаблицаЗначений");
М.Выгрузить(В,,,Колонка);
В.Свернуть(Колонка,);
В.Выгрузить(Список,,,Колонка);
Возврат(Список);
КонецФункции
//процедура преобразует строку со значениями в список значений
Процедура сзПарсить(Список,Текст) Экспорт
Если ПустаяСтрока(Текст)=0 Тогда
Если Найти(Текст,"=")=0 Тогда
//делитель - Запятая
Значение=СтрЗаменить(СокрЛП(Текст),",",Симв(34)+","+Симв(34));
Значение=Симв(34)+Значение+Симв(34);
Список.ИзСтрокиСРазделителями(Значение);
Иначе
//делитель - Точка с запятой
Текст=СтрЗаменить(Текст,";",РазделительСтрок);
Для й=1 По Текст.КоличествоСтрок() Цикл
Стр=Текст.ПолучитьСтроку(й);
Если ПустаяСтрока(Стр)=0 Тогда
Позиция=Найти(Стр,"=");
Если Позиция>0 Тогда
Идентификатор=Лев(Стр,Позиция-1);
Значение=Сред(Стр,Позиция+1);
Список.Установить(СокрЛП(Идентификатор),СокрЛП(Значение));
Иначе
Список.ДобавитьЗначение(СокрЛП(Стр));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//процедура позиционирует строку списка значений на заданном значении
Процедура сзУстановить(Список,Значение) Экспорт
Позиция=Список.НайтиЗначение(Значение);
Если Позиция>0 Тогда
Список.ТекущаяСтрока(Позиция);
КонецЕсли;
КонецПроцедуры
Таблица значений в 1С
Код //процедура сдвигает строку в таблице значений;
//если сдвигается последняя строка вниз, то строка становится первой;
//если сдвигается первая строка вверх, то строка перемещается в конец таблицы значений
Процедура Количество=1-М.КоличествоСтрок();
ИначеЕсли (Количество<0) И (М.ТекущаяСтрока()=1) Тогда
Количество=М.КоличествоСтрок()-1;
КонецЕсли;
М.СдвинутьСтроку(Количество,М.ТекущаяСтрока())());
КонецПроцедуры
//процедура обнуляет значения таблицы значений вниз от заданной строки и вправо от заданной колонки
Процедура тзОбнулить(М,НомерСтр,НомерКол) Экспорт
Для i=НомерСтр По М.КоличествоСтрок() Цикл
Для j=НомерКол По М.КоличествоКолонок() Цикл
М.УстановитьЗначение(i,j,0);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//процедура удаляет строку в интерактивной таблице значений> Процедура тзУдалитьСтроку(М) Экспорт
//запоминание текущей строки
ТекСтрока=М.ТекущаяСтрока()-1;
//удаление
М.УдалитьСтроку();
//позиционирование
Если М.КоличествоСтрок()>0 Тогда
ТекСтрока=Мин(ТекСтрока,М.КоличествоСтрок());
М.ТекущаяСтрока(ТекСтрока);
КонецЕсли;
КонецПроцедуры
//процедура находит документ с заданным номером в таблице значений с документами
Процедура гЖурнал_Найти(М) Экспорт
НомерДок=0;
Если ВвестиЧисло(НомерДок,"Номер документа",5,0)=1 Тогда
//поиск по номеру в выборке
Если М.НайтиЗначение(НомерДок,,"Номер")=0 Тогда
Предупреждение("Документ № "+НомерДок+" не найден");
Возврат;
КонецЕсли;
//поиск документа
Список=СоздатьОбъект("СписокЗначений");
М.ВыбратьСтроки();
Пока М.ПолучитьСтроку()=1 Цикл
Если М.Номер=НомерДок Тогда
Список.ДобавитьЗначение(М.ТекущийДокумент);
КонецЕсли;
КонецЦикла;
//выбор
Значение="";
Если Список.РазмерСписка()=1 Тогда
Значение=Список.ПолучитьЗначение(1);
ИначеЕсли Список.ВыбратьЗначение(Значение,"Выбор документа")=0 Тогда
Возврат;
КонецЕсли;
//позиционирование
НомерСтр=0;
М.НайтиЗначение(Значение,НомерСтр,"ТекущийДокумент");
М.ТекущаяСтрока(НомерСтр);
КонецЕсли;
КонецПроцедуры
Таблица или печатная форма в 1С
Код //установление автоширины колонок таблицы
Процедура гАвтоШиринаКолонок(Таб,НачКол,НачСтр) Экспорт
Для НомерКол=НачКол По Таб.ШиринаТаблицы() Цикл
МаксШирина=0;
Для НомерСтр=НачСтр По Таб.ВысотаТаблицы() Цикл
ТекШирина=СтрДлина(Таб.Область(НомерСтр,НомерКол).Текст);
МаксШирина=Макс(МаксШирина,ТекШирина);
КонецЦикла;
Таб.Область(,НомерКол).ШиринаСтолбца(МаксШирина+2);
КонецЦикла;
КонецПроцедуры
Периоды и даты в 1С
Код //функция проверяет, равен ли месяцу интервал между заданными датами
Функция ЭтоМесяц(ДатаН,ДатаК) Экспорт
Если Не(ДатаН=НачМесяца(ДатаН)) Тогда
Возврат(0);
ИначеЕсли Не(ДатаК=КонМесяца(ДатаК)) Тогда
Возврат(0);
ИначеЕсли ДатаН=НачМесяца(ДатаК) Тогда
Возврат(1);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
//функция возвращает количество полных месяцев между датами
Функция гМесяцев(ДатаН,ДатаК) Экспорт
Если ДатаН<ДатаК Тогда
ТекДата=НачМесяца(ДатаН);
Значение=1;
Пока ТекДата<НачМесяца(ДатаК) Цикл
ТекДата=ДобавитьМесяц(ТекДата,1);
Значение=Значение+1;
КонецЦикла;
Возврат(Значение);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
//функция определяет порядковый номер месяца в квартале
Функция гМесяцКвартала(ДатаДок) Экспорт
НачМесяц=ДатаМесяц(НачКвартала(ДатаДок));
КонМесяц=ДатаМесяц(ДатаДок);
Возврат(КонМесяц-НачМесяц+1);
КонецФункции
//функция определяет порядковый номер квартала по дате
Функция гДатаКвартал(аДата) Экспорт
Возврат ДатаМесяц(КонКвартала(аДата))/3;
КонецФункции
Календари и праздники в 1С
Код //ф//функция возвращает дату, находящуюся на определённом интервале дней от заданной даты, без учёта выходных;
//например, используется для определения конечной даты действия счёта-фактуры
Функция an class="color-blue">гСрокДействия(ДатаДок,Период,Вид="Основной") Экспорт
К=СоздатьОбъект("Календарь."+Вид);
К.УчитыватьПраздники(1);
Если К.Автозаполнение(ДатаДок,ДобавитьМесяц(ДатаДок+Период,1))=1 Тогда
Возврат К.ПолучитьДату(ДатаДок,Период);
КонецЕсли;
КонецФункции
//функция определяет количество рабочих дней в интервале дат
Функция гРабочиеДни(ДатаН,ДатаК,Вид="Основной") Экспорт
К=СоздатьОбъект("Календарь."+Вид);
К.УчитыватьПраздники(1);
Если К.Автозаполнение(ДатаН,ДатаК)=1 Тогда
Возврат К.Дней(ДатаН,ДатаК);
КонецЕсли;
КонецФункции
//функция определяет количество праздничных дней в интервале дат
Функция гПраздники(ДатаН,ДатаК) Экспорт
Кол=0;
//
П=СоздатьОбъект("Праздники");
П.ВыбратьДаты(ДатаН,ДатаК);
Пока П.СледующаяДата()=1 Цикл
Если НомерДняНедели(П.Дата)<6 Тогда
Кол=Кол+1;
КонецЕсли;
КонецЦикла;
//
Возврат(Кол);
КонецФункции
Справочники в 1С
Код //функция возвращает элемент заданного справочника по значению реквизита "Счет"
Функция сНайтиПоСчету(Счет,Справочник,Реквизит="Счет") Экспорт
С=СоздатьОбъект("Справочник."+Справочник);
Если С.НайтиПоРеквизиту(Реквизит,Счет,1)=1 Тогда
Возврат С.ТекущийЭлемент();
Иначе
Возврат ПолучитьПустоеЗначение("Справочник."+Справочник);
КонецЕсли;
КонецФункции
//функция возвращает элемент заданного справочника по полному коду элемента
Функция сНайтиПоКоду(Справочник,Код) Экспорт
С=СоздатьОбъект("Справочник."+Справочник);
Если С.НайтиПоКоду(Код,2)=1 Тогда
Возврат С.ТекущийЭлемент();
Иначе
Возврат ПолучитьПустоеЗначение("Справочник."+Справочник);
КонецЕсли;
КонецФункции
//функция возвращает элемент заданного справочника по
//наименованию
//если элемент отсутствует в справочнике, то создаётся новый
Функция сНайтиПоНаименованию(Справочник,Наименование) Экспорт
С=СоздатьОбъект("Справочник."+Справочник);
Если С.НайтиПоНаименованию(Наименование,0,1)=0 Тогда
С.Новый();
С.Наименование=Наименование;
С.Записать();
Сообщить("Справочник "+Справочник+": Новый элемент "+Наименование);
КонецЕсли;
Возврат(С.ТекущийЭлемент());
КонецФункции
//процедура удаляет заданный элемент справочника
Процедура гЭлемент_Удалить(Элемент,Флаг) Экспорт
С=СоздатьОбъект("Справочник."+Элемент.Вид());
С.НайтиЭлемент(Элемент);
С.Удалить(Флаг);
КонецПроцедуры
//функция возвращает строку вида "Иванов И.И." из переданной в функцию строки вида "Иванов Иван Иванович"
Функция гФио_Получить(Значение)
Стр=гФорматС(Значение);
Стр=СтрЗаменить(Стр," ",РазделительСтрок);
Если СтрКоличествоСтрок(Стр)=1 Тогда
Фио=СокрЛП(Стр);
ИначеЕсли СтрКоличествоСтрок(Стр)=2 Тогда
СтрФ=СтрПолучитьСтроку(Стр,1);
СтрИ=СтрПолучитьСтроку(Стр,2);
Фио=СокрЛП(СтрФ)+" "+Лев(СокрЛП(СтрИ),1)+".";
Иначе
СтрО=СтрПолучитьСтроку(Стр,СтрКоличествоСтрок(Стр));
СтрИ=СтрПолучитьСтроку(Стр,СтрКоличествоСтрок(Стр-1));
СтрФ="";
Для й=1 По СтрКоличествоСтрок(Стр)-2 Цикл
СтрФ=СтрФ+" "+СтрПолучитьСтроку(Стр,й);
КонецЦикла;
Фио=СокрЛП(СтрФ)+" "+Лев(СокрЛП(СтрИ),1)+"."+Лев(СокрЛП(СтрО),1)+".";
КонецЕсли;
Возврат(Фио);
КонецФункции
//функция открывает подбор из справочника и предоставляет пользователю выбор из элементов фиксированной группы
Функция сПодборРодитель(Ко,Родитель,Элемент,Заголовок="")
Экспорт
Ко.ОткрытьПодбор("Справочник."+Родитель.Вид(),"ДляВыбора",,0);
Ко.КонтекстПодбора.ИспользоватьРодителя(Родитель,0);
Ко.КонтекстПодбора.ИерархическийСписок(1,0);
//текущий элемент
Если Элемент.Выбран()=1 Тогда
Ко.КонтекстПодбора.АктивизироватьОбъект(Элемент);
КонецЕсли;
//заголовок
Если ПустаяСтрока(Заголовок)=0 Тогда
Ко.КонтекстПодбора.Форма.Заголовок(Заголовок,0);
КонецЕсли;
//отмена стандартной обработки
Возврат(0);
КонецФункции
Документы в 1С
Код //удаление ведущих нолей в номере документа
Функция гНомерДок(Значение) Экспорт
Текст=СокрЛП(Значение);
Текст=СтрЗаменить(Текст," ","");
Текст=СтрЗаменить(Текст,"_","-");
Если Константа.ФлагНомерОсн=0 Тогда
Возврат(Текст);
ИначеЕсли Текст="0" Тогда
Возврат(Текст);
КонецЕсли;
//префикс
Префикс="";
Для i=1 По СтрЧислоВхождений(Текст,"-") Цикл
Позиция=Найти(Текст,"-");
Префикс=Префикс+Лев(Текст,Позиция);
Текст=Сред(Текст,Позиция+1);
КонецЦикла;
//удаление нолей
ФлагЧисло=0;
Номер="";
Для i=1 По СтрДлина(Текст) Цикл
Символ=Сред(Текст,i,1);
Если ЭтоЧисло(Символ)=0 Тогда
Номер=Номер+Символ;
ИначеЕсли Не(Число(Символ)=0) Тогда
Номер=Номер+Символ;
ФлагЧисло=1;
ИначеЕсли ФлагЧисло=1 Тогда
Номер=Номер+Символ;
КонецЕсли;
КонецЦикла;
//
Возврат(Префикс+Номер);
КонецФункции
//функция возвращает числовой номер документа без префикса
Функция гНомерБезПрефикса(Значение) Экспорт
Номер=гНомерДок(Значение);
Позиция=Найти(Значение,"-");
Номер=Сред(Номер,Позиция+1);
Возврат(Номер);
КонецФункции
//функция создаёт таблицу значений документов заданного вида по одному клиенту и даёт выбрать один документ
Функция гДокументКлиента(Значение,Клиент,ВидДокумента) Экспорт
Если Клиент.Выбран()=0 Тогда
Предупреждение("Не выбран Контрагент!");
Возврат(0);
КонецЕсли;
//таблица
М=СоздатьОбъект("ТаблицаЗначений");
М.НоваяКолонка("Дата","Дата",,,,10);
М.НоваяКолонка("Док","Строка",,,"Документ",50);
М.НоваяКолонка("Сумма","Число",,,,18,"Ч015.2");
М.НоваяКолонка("Документ","Документ");
М.ВидимостьКолонки("Документ",0);
//документы
Д=СоздатьОбъект("Документ");
Д.ВыбратьПоЗначению(,,"Клиент",Клиент);
Пока Д.ПолучитьДокумент()=1 Цикл
Состояние(""+Д.ДатаДок);
Если Не(Д.Вид()=ВидДокумента) Тогда
Продолжить;
КонецЕсли;
//
М.НоваяСтрока();
М.Документ=Д.ТекущийДокумент();
М.Дата=Д.ДатаДок;
М.Док=Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок);
//сумма
Ж=Метаданные.Документ(Д.Вид());
Если Ж.РеквизитТабличнойЧасти("ВалСумма").Выбран()=1 Тогда
М.Сумма=Д.Итог("ВалСумма");
ИначеЕсли Ж.РеквизитТабличнойЧасти("СуммаС").Выбран()=1 Тогда
М.Сумма=Д.Итог("СуммаС");
ИначеЕсли Ж.РеквизитТабличнойЧасти("Сумма").Выбран()=1 Тогда
М.Сумма=Д.Итог("Сумма");
КонецЕсли;
КонецЦикла;
//проверка
Если М.КоличествоСтрок()=0 Тогда
Предупреждение("Документы не найдены!");
Возврат(0);
КонецЕсли;
//строка по умолчанию
НомерСтр=0;
Если М.НайтиЗначение(Значение,НомерСтр,"Документ")=0 Тогда
НомерСтр=М.КоличествоСтрок();
КонецЕсли;
//выбор
Заголовок=Метаданные.Документ(ВидДокумента).Представление()+": "+Клиент.Наименование;
Если М.ВыбратьСтроку(НомерСтр,Заголовок)=1 Тогда
Значение=М.ПолучитьЗначение(НомерСтр,"Документ");
Возврат(1);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
Предопределённые функции и процедуры в 1С
Код Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг,Таблица,Адрес)
Перем Ответ;
Перем Ко;
Если ПустоеЗначение(Значение)=1 Тогда
Предупреждение("Невозможно обработать значение ячейки!");
ИначеЕсли ТипЗначенияСтр(Значение)="Документ" Тогда
Если гПользователь.ФлагСписок=0 Тогда
Флаг=1;
Иначе
А=СоздатьОбъект("СписокЗначений");
А.ДобавитьЗначение(0,"Открыть документ");
А.ДобавитьЗначение(1,"Открыть в журнале документов");
Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
Если Ответ=0 Тогда
Флаг=1;
Иначе
Журнал=Метаданные.Документ(Значение.Вид()).Журнал.
Идентификатор;
ОткрытьФорму("Журнал."+Журнал+".Основная",Ко);
Ко.АктивизироватьОбъект(Значение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(Значение)="Справочник" Тогда
Если гПользователь.ФлагСписок=0 Тогда
Флаг=1;
Иначе
А=СоздатьОбъект("СписокЗначений");
А.ДобавитьЗначение(0,"Открыть элемент");
А.ДобавитьЗначение(1,"Открыть в списке справочника");
Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
Если Ответ=0 Тогда
Флаг=1;
Иначе
Журнал=Метаданные.Справочник(Значение.Вид()).ОсновнаяФорма;
ОткрытьФорму("Справочник."+Значение.Вид()+"."+Журнал,Ко);
Ко.АктивизироватьОбъект(Значение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(Значение)="СписокЗначений" Тогда
//расшифровка - СписокЗначений
Кнопка=Значение.Получить("Кнопка");
Если Число(Кнопка)=0 Тогда
Значение.СортироватьПоПредставлению();
//обработка - Ячейка
Представление="";
А=СоздатьОбъект("СписокЗначений");
Для i=1 По Значение.РазмерСписка() Цикл
Отчет=Значение.ПолучитьЗначение(i,Представление);
Если ПустаяСтрока(Отчет)=1 Тогда
Продолжить;
ИначеЕсли Лев(Представление,4)="Меню" Тогда
//элемент контекстного меню в ячейке
Позиция=Найти(Отчет,"|");
Если Позиция=0 Тогда
Представление=Метаданные.Отчет(Отчет).Представление();
Иначе
Добавка=Сред(Отчет,Позиция+1);
Отчет=Лев(Отчет,Позиция-1);
Представление=Метаданные.Отчет(Отчет).Представление()+": "+Добавка;
КонецЕсли;
А.ДобавитьЗначение(Отчет,Представление);
КонецЕсли;
КонецЦикла;
//контекстное меню в ячейке
Если А.РазмерСписка()>0 Тогда
Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
Значение.Выгрузить(гПакет);
гПакет.Установить("Таблица","");
ОткрытьФормуМодально("Отчет."+Ответ,1+гПользователь.ФлагОтчет);
КонецЕсли;
КонецЕсли;
Иначе
//обработка - Кнопка
Значение.Выгрузить(гПакет);
гПакет.Установить("Таблица",Таблица);
Отчет=Значение.Получить("Отчет");
ОткрытьФормуМодально("Отчет."+Отчет,Кнопка);
гПакет.Установить("Таблица","");
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(Значение)="Строка" Тогда
Если ВРег(Лев(СокрЛП(Значение),6))="ССЫЛКА" Тогда
СтрокаЗапуска=СокрЛП(Сред(Значение,7));
ЗапуститьПриложение(СтрокаЗапуска);
Иначе
Флаг=1;
КонецЕсли;
Иначе
//расшифровка - Стандартная обработка ячейки
Флаг=1;
КонецЕсли;
КонецПроцедуры
Налоговый учёт и первое событие в 1С
Код
//функция определяет сумму первого события за период по заданным остаткам на начало и конец периода
Функция гПервоеСобытие(НачД,НачК,КонД,КонК) Экспорт
//первое событие
СуммаД=Макс(КонД-НачД,0);
СуммаК=Макс(КонК-НачК,0);
//сумма
Возврат(СуммаД+СуммаК);
КонецФункции
Резюме
В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
Источник публикации
Разместил: Андрей Громов
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
Форматирование данных в 1С
Код //форматирование числа
Функция гЧисло(Значение,Знаки=2) Экспорт
Ответ=Формат(Значение,"Ч18."+Знаки);
Возврат СокрЛП(Ответ);
КонецФункции
//функция убирает лишние пробелы
Функция гСжатьПробелы(аТекст) Экспорт
Текст=СокрЛП(аТекст);
//пробелы
Замена=Формат(" ","С5");
Для й=1 По 4 Цикл
Знак=Сред(Замена,й);
Текст=СтрЗаменить(Текст,Знак," ");
КонецЦикла;
//
Возврат СокрЛП(Текст);
КонецФункции
//функция возвращает переданную строку, в которой первая буква устанавливается в верхнем или в нижнем регистре
Функция гБуква(Текст,ФлагНрег=0) Экспорт
Буква=Лев(Текст,1);
Если ФлагНрег=0 Тогда
Буква=ВРег(Буква);
Иначе
Буква=НРег(Буква);
КонецЕсли;
Возврат(Буква+Сред(Текст,2));
КонецФункции
/функция возвращает представление переданного документа
Функция гПредставлениеДокумента(Д) Экспорт
Возврат Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок)+" ("+Д.ДатаДок+")";
КонецФункции
//процедура выдаёт сообщение при проведении документа
Процедура гСообщить(Ко,Текст,НомерСтроки=0,Символ="!") Экспорт
//сигнал
Если Ко.Ошибка=0 Тогда
Сигнал();
КонецЕсли;
//документ
Документ=""+Ко.ДатаДок+" "+Ко.ПредставлениеВида()+" "+СокрЛП(Ко.НомерДок);
//номер строки
Если НомерСтроки>0 Тогда
Документ=Документ+" (строка "+НомерСтроки+")";
КонецЕсли;
//сообщение
Сообщить(Документ+": "+Текст,Символ);
КонецПроцедуры
Список значений в 1С
Код //процедура выполняется при добавлении нового значения в интерактивный список значений
Процедура сзДобавить(Список,Тип,Вид,Длина,Точность,Подсказка) Экспорт
//тип
Если (Тип="Справочник") Или (Тип="Документ") Тогда
Тип=Тип+"."+Вид;
КонецЕсли;
//значение
Если Список.ТекущаяСтрока()=0 Тогда
Значение="";
Иначе
Значение=Список.ПолучитьЗначение(Список.ТекущаяСтрока());
КонецЕсли;
//выбор
Если ВвестиЗначение(Значение,Подсказка,Тип,Длина,Точность)=1 Тогда
Список.ДобавитьЗначение(Значение);
КонецЕсли;
КонецПроцедуры
//процедура выполняется для изменения значения интерактивного списка значений
Процедура сзИзменить(Список) Экспорт
Позиция=Список.ТекущаяСтрока();
Если Позиция=0 Тогда
Возврат;
КонецЕсли;
//
Значение=Список.ПолучитьЗначение(Список.ТекущаяСтрока());
Тип=ТипЗначенияСтр(Значение);
Если (Тип="Справочник") Или (Тип="Документ") Тогда
Тип=Тип+"."+Значение.Вид();
Подсказка=Значение.Вид();
Иначе
Подсказка=Тип;
КонецЕсли;
Если ВвестиЗначение(Значение,Подсказка,Тип)=1 Тогда
Список.УстановитьЗначение(Позиция,Значение);
КонецЕсли;
КонецПроцедуры
//процедура выполняется при удалении значения из интерактивного списка значений
Процедура сзУдалить(Список) Экспорт
Если Список.ТекущаяСтрока()>0 Тогда
Список.УдалитьЗначение(Список.ТекущаяСтрока());
КонецЕсли;
КонецПроцедуры
//процедура изменяет позицию значения интерактивного списка значений
Процедура сзСдвинуть(Список,Количество) Экспорт
Если (Количество>0) И (Список.ТекущаяСтрока()=Список.РазмерСписка()) Тогда
Количество=1-Список.РазмерСписка();
ИначеЕсли (Количество<0) И (Список.ТекущаяСтрока()=1) Тогда
Количество=Список.РазмерСписка()-1;
КонецЕсли;
Список.СдвинутьЗначение(Количество,Список.ТекущаяСтрока());
КонецПроцедуры
//функция проверяет наличие в списке значений с пометками хотя бы одного помеченного значения
Функция сзПометка(Список) Экспорт
Для i=1 По Список.РазмерСписка() Цикл
Если Список.Пометка(i)=1 Тогда
Возврат(1);
КонецЕсли;
КонецЦикла;
//нет пометок
Возврат(0);
КонецФункции
//функция помечает или снимает пометку для всех значений списка
Процедура сзПометить(Список,Флаг) Экспорт
Для й=1 По Список.РазмерСписка() Цикл
Список.Пометка(й,Флаг);
КонецЦикла;
КонецПроцедуры
//процедура оставляет в списке значений заданное количество значений
Процедура сзОбрезать(Список,Размер) Экспорт
Если Список.РазмерСписка()>Размер Тогда
Количество=Список.РазмерСписка()-Размер;
Список.УдалитьЗначение(Размер+1,Количество);
КонецЕсли;
КонецПроцедуры
//функция выгружает значения колонки таблицы значений в список значений
Функция сзКолонка(М,Колонка) Экспорт
Список=СоздатьОбъект("СписокЗначений");
//
В=СоздатьОбъект("ТаблицаЗначений");
М.Выгрузить(В,,,Колонка);
В.Свернуть(Колонка,);
В.Выгрузить(Список,,,Колонка);
Возврат(Список);
КонецФункции
//процедура преобразует строку со значениями в список значений
Процедура сзПарсить(Список,Текст) Экспорт
Если ПустаяСтрока(Текст)=0 Тогда
Если Найти(Текст,"=")=0 Тогда
//делитель - Запятая
Значение=СтрЗаменить(СокрЛП(Текст),",",Симв(34)+","+Симв(34));
Значение=Симв(34)+Значение+Симв(34);
Список.ИзСтрокиСРазделителями(Значение);
Иначе
//делитель - Точка с запятой
Текст=СтрЗаменить(Текст,";",РазделительСтрок);
Для й=1 По Текст.КоличествоСтрок() Цикл
Стр=Текст.ПолучитьСтроку(й);
Если ПустаяСтрока(Стр)=0 Тогда
Позиция=Найти(Стр,"=");
Если Позиция>0 Тогда
Идентификатор=Лев(Стр,Позиция-1);
Значение=Сред(Стр,Позиция+1);
Список.Установить(СокрЛП(Идентификатор),СокрЛП(Значение));
Иначе
Список.ДобавитьЗначение(СокрЛП(Стр));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//процедура позиционирует строку списка значений на заданном значении
Процедура сзУстановить(Список,Значение) Экспорт
Позиция=Список.НайтиЗначение(Значение);
Если Позиция>0 Тогда
Список.ТекущаяСтрока(Позиция);
КонецЕсли;
КонецПроцедуры
Таблица значений в 1С
Код //процедура сдвигает строку в таблице значений;
//если сдвигается последняя строка вниз, то строка становится первой;
//если сдвигается первая строка вверх, то строка перемещается в конец таблицы значений
Процедура Количество=1-М.КоличествоСтрок();
ИначеЕсли (Количество<0) И (М.ТекущаяСтрока()=1) Тогда
Количество=М.КоличествоСтрок()-1;
КонецЕсли;
М.СдвинутьСтроку(Количество,М.ТекущаяСтрока())());
КонецПроцедуры
//процедура обнуляет значения таблицы значений вниз от заданной строки и вправо от заданной колонки
Процедура тзОбнулить(М,НомерСтр,НомерКол) Экспорт
Для i=НомерСтр По М.КоличествоСтрок() Цикл
Для j=НомерКол По М.КоличествоКолонок() Цикл
М.УстановитьЗначение(i,j,0);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//процедура удаляет строку в интерактивной таблице значений> Процедура тзУдалитьСтроку(М) Экспорт
//запоминание текущей строки
ТекСтрока=М.ТекущаяСтрока()-1;
//удаление
М.УдалитьСтроку();
//позиционирование
Если М.КоличествоСтрок()>0 Тогда
ТекСтрока=Мин(ТекСтрока,М.КоличествоСтрок());
М.ТекущаяСтрока(ТекСтрока);
КонецЕсли;
КонецПроцедуры
//процедура находит документ с заданным номером в таблице значений с документами
Процедура гЖурнал_Найти(М) Экспорт
НомерДок=0;
Если ВвестиЧисло(НомерДок,"Номер документа",5,0)=1 Тогда
//поиск по номеру в выборке
Если М.НайтиЗначение(НомерДок,,"Номер")=0 Тогда
Предупреждение("Документ № "+НомерДок+" не найден");
Возврат;
КонецЕсли;
//поиск документа
Список=СоздатьОбъект("СписокЗначений");
М.ВыбратьСтроки();
Пока М.ПолучитьСтроку()=1 Цикл
Если М.Номер=НомерДок Тогда
Список.ДобавитьЗначение(М.ТекущийДокумент);
КонецЕсли;
КонецЦикла;
//выбор
Значение="";
Если Список.РазмерСписка()=1 Тогда
Значение=Список.ПолучитьЗначение(1);
ИначеЕсли Список.ВыбратьЗначение(Значение,"Выбор документа")=0 Тогда
Возврат;
КонецЕсли;
//позиционирование
НомерСтр=0;
М.НайтиЗначение(Значение,НомерСтр,"ТекущийДокумент");
М.ТекущаяСтрока(НомерСтр);
КонецЕсли;
КонецПроцедуры
Таблица или печатная форма в 1С
Код //установление автоширины колонок таблицы
Процедура гАвтоШиринаКолонок(Таб,НачКол,НачСтр) Экспорт
Для НомерКол=НачКол По Таб.ШиринаТаблицы() Цикл
МаксШирина=0;
Для НомерСтр=НачСтр По Таб.ВысотаТаблицы() Цикл
ТекШирина=СтрДлина(Таб.Область(НомерСтр,НомерКол).Текст);
МаксШирина=Макс(МаксШирина,ТекШирина);
КонецЦикла;
Таб.Область(,НомерКол).ШиринаСтолбца(МаксШирина+2);
КонецЦикла;
КонецПроцедуры
Периоды и даты в 1С
Код //функция проверяет, равен ли месяцу интервал между заданными датами
Функция ЭтоМесяц(ДатаН,ДатаК) Экспорт
Если Не(ДатаН=НачМесяца(ДатаН)) Тогда
Возврат(0);
ИначеЕсли Не(ДатаК=КонМесяца(ДатаК)) Тогда
Возврат(0);
ИначеЕсли ДатаН=НачМесяца(ДатаК) Тогда
Возврат(1);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
//функция возвращает количество полных месяцев между датами
Функция гМесяцев(ДатаН,ДатаК) Экспорт
Если ДатаН<ДатаК Тогда
ТекДата=НачМесяца(ДатаН);
Значение=1;
Пока ТекДата<НачМесяца(ДатаК) Цикл
ТекДата=ДобавитьМесяц(ТекДата,1);
Значение=Значение+1;
КонецЦикла;
Возврат(Значение);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
//функция определяет порядковый номер месяца в квартале
Функция гМесяцКвартала(ДатаДок) Экспорт
НачМесяц=ДатаМесяц(НачКвартала(ДатаДок));
КонМесяц=ДатаМесяц(ДатаДок);
Возврат(КонМесяц-НачМесяц+1);
КонецФункции
//функция определяет порядковый номер квартала по дате
Функция гДатаКвартал(аДата) Экспорт
Возврат ДатаМесяц(КонКвартала(аДата))/3;
КонецФункции
Календари и праздники в 1С
Код //ф//функция возвращает дату, находящуюся на определённом интервале дней от заданной даты, без учёта выходных;
//например, используется для определения конечной даты действия счёта-фактуры
Функция an class="color-blue">гСрокДействия(ДатаДок,Период,Вид="Основной") Экспорт
К=СоздатьОбъект("Календарь."+Вид);
К.УчитыватьПраздники(1);
Если К.Автозаполнение(ДатаДок,ДобавитьМесяц(ДатаДок+Период,1))=1 Тогда
Возврат К.ПолучитьДату(ДатаДок,Период);
КонецЕсли;
КонецФункции
//функция определяет количество рабочих дней в интервале дат
Функция гРабочиеДни(ДатаН,ДатаК,Вид="Основной") Экспорт
К=СоздатьОбъект("Календарь."+Вид);
К.УчитыватьПраздники(1);
Если К.Автозаполнение(ДатаН,ДатаК)=1 Тогда
Возврат К.Дней(ДатаН,ДатаК);
КонецЕсли;
КонецФункции
//функция определяет количество праздничных дней в интервале дат
Функция гПраздники(ДатаН,ДатаК) Экспорт
Кол=0;
//
П=СоздатьОбъект("Праздники");
П.ВыбратьДаты(ДатаН,ДатаК);
Пока П.СледующаяДата()=1 Цикл
Если НомерДняНедели(П.Дата)<6 Тогда
Кол=Кол+1;
КонецЕсли;
КонецЦикла;
//
Возврат(Кол);
КонецФункции
[pagebreak]
Справочники в 1С
Код //функция возвращает элемент заданного справочника по значению реквизита "Счет"
Функция сНайтиПоСчету(Счет,Справочник,Реквизит="Счет") Экспорт
С=СоздатьОбъект("Справочник."+Справочник);
Если С.НайтиПоРеквизиту(Реквизит,Счет,1)=1 Тогда
Возврат С.ТекущийЭлемент();
Иначе
Возврат ПолучитьПустоеЗначение("Справочник."+Справочник);
КонецЕсли;
КонецФункции
//функция возвращает элемент заданного справочника по полному коду элемента
Функция сНайтиПоКоду(Справочник,Код) Экспорт
С=СоздатьОбъект("Справочник."+Справочник);
Если С.НайтиПоКоду(Код,2)=1 Тогда
Возврат С.ТекущийЭлемент();
Иначе
Возврат ПолучитьПустоеЗначение("Справочник."+Справочник);
КонецЕсли;
КонецФункции
//функция возвращает элемент заданного справочника по наименованию
//если элемент отсутствует в справочнике, то создаётся новый
Функция сНайтиПоНаименованию(Справочник,Наименование) Экспорт
С=СоздатьОбъект("Справочник."+Справочник);
Если С.НайтиПоНаименованию(Наименование,0,1)=0 Тогда
С.Новый();
С.Наименование=Наименование;
С.Записать();
Сообщить("Справочник "+Справочник+": Новый элемент "+Наименование);
КонецЕсли;
Возврат(С.ТекущийЭлемент());
КонецФункции
//процедура удаляет заданный элемент справочника
Процедура гЭлемент_Удалить(Элемент,Флаг) Экспорт
С=СоздатьОбъект("Справочник."+Элемент.Вид());
С.НайтиЭлемент(Элемент);
С.Удалить(Флаг);
КонецПроцедуры
//функция возвращает строку вида "Иванов И.И." из переданной в функцию строки вида "Иванов Иван Иванович"
Функция гФио_Получить(Значение)
Стр=гФорматС(Значение);
Стр=СтрЗаменить(Стр," ",РазделительСтрок);
Если СтрКоличествоСтрок(Стр)=1 Тогда
Фио=СокрЛП(Стр);
ИначеЕсли СтрКоличествоСтрок(Стр)=2 Тогда
СтрФ=СтрПолучитьСтроку(Стр,1);
СтрИ=СтрПолучитьСтроку(Стр,2);
Фио=СокрЛП(СтрФ)+" "+Лев(СокрЛП(СтрИ),1)+".";
Иначе
СтрО=СтрПолучитьСтроку(Стр,СтрКоличествоСтрок(Стр));
СтрИ=СтрПолучитьСтроку(Стр,СтрКоличествоСтрок(Стр-1));
СтрФ="";
Для й=1 По СтрКоличествоСтрок(Стр)-2 Цикл
СтрФ=СтрФ+" "+СтрПолучитьСтроку(Стр,й);
КонецЦикла;
Фио=СокрЛП(СтрФ)+" "+Лев(СокрЛП(СтрИ),1)+"."+Лев(СокрЛП(СтрО),1)+".";
КонецЕсли;
Возврат(Фио);
КонецФункции
//функция открывает подбор из справочника и предоставляет пользователю выбор из элементов фиксированной группы
Функция сПодборРодитель(Ко,Родитель,Элемент,Заголовок="") Экспорт
Ко.ОткрытьПодбор("Справочник."+Родитель.Вид(),"ДляВыбора",,0);
Ко.КонтекстПодбора.ИспользоватьРодителя(Родитель,0);
Ко.КонтекстПодбора.ИерархическийСписок(1,0);
//текущий элемент
Если Элемент.Выбран()=1 Тогда
Ко.КонтекстПодбора.АктивизироватьОбъект(Элемент);
КонецЕсли;
//заголовок
Если ПустаяСтрока(Заголовок)=0 Тогда
Ко.КонтекстПодбора.Форма.Заголовок(Заголовок,0);
КонецЕсли;
//отмена стандартной обработки
Возврат(0);
КонецФункции
Документы в 1С
Код //удаление ведущих нолей в номере документа
Функция гНомерДок(Значение) Экспорт
Текст=СокрЛП(Значение);
Текст=СтрЗаменить(Текст," ","");
Текст=СтрЗаменить(Текст,"_","-");
Если Константа.ФлагНомерОсн=0 Тогда
Возврат(Текст);
ИначеЕсли Текст="0" Тогда
Возврат(Текст);
КонецЕсли;
//префикс
Префикс="";
Для i=1 По СтрЧислоВхождений(Текст,"-") Цикл
Позиция=Найти(Текст,"-");
Префикс=Префикс+Лев(Текст,Позиция);
Текст=Сред(Текст,Позиция+1);
КонецЦикла;
//удаление нолей
ФлагЧисло=0;
Номер="";
Для i=1 По СтрДлина(Текст) Цикл
Символ=Сред(Текст,i,1);
Если ЭтоЧисло(Символ)=0 Тогда
Номер=Номер+Символ;
ИначеЕсли Не(Число(Символ)=0) Тогда
Номер=Номер+Символ;
ФлагЧисло=1;
ИначеЕсли ФлагЧисло=1 Тогда
Номер=Номер+Символ;
КонецЕсли;
КонецЦикла;
//
Возврат(Префикс+Номер);
КонецФункции
//функция возвращает числовой номер документа без префикса
Функция гНомерБезПрефикса(Значение) Экспорт
Номер=гНомерДок(Значение);
Позиция=Найти(Значение,"-");
Номер=Сред(Номер,Позиция+1);
Возврат(Номер);
КонецФункции
//функция создаёт таблицу значений документов заданного вида по одному клиенту и даёт выбрать один документ
Функция гДокументКлиента(Значение,Клиент,ВидДокумента) Экспорт
Если Клиент.Выбран()=0 Тогда
Предупреждение("Не выбран Контрагент!");
Возврат(0);
КонецЕсли;
//таблица
М=СоздатьОбъект("ТаблицаЗначений");
М.НоваяКолонка("Дата","Дата",,,,10);
М.НоваяКолонка("Док","Строка",,,"Документ",50);
М.НоваяКолонка("Сумма","Число",,,,18,"Ч015.2");
М.НоваяКолонка("Документ","Документ");
М.ВидимостьКолонки("Документ",0);
//документы
Д=СоздатьОбъект("Документ");
Д.ВыбратьПоЗначению(,,"Клиент",Клиент);
Пока Д.ПолучитьДокумент()=1 Цикл
Состояние(""+Д.ДатаДок);
Если Не(Д.Вид()=ВидДокумента) Тогда
Продолжить;
КонецЕсли;
//
М.НоваяСтрока();
М.Документ=Д.ТекущийДокумент();
М.Дата=Д.ДатаДок;
М.Док=Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок);
//сумма
Ж=Метаданные.Документ(Д.Вид());
Если Ж.РеквизитТабличнойЧасти("ВалСумма").Выбран()=1 Тогда
М.Сумма=Д.Итог("ВалСумма");
ИначеЕсли Ж.РеквизитТабличнойЧасти("СуммаС").Выбран()=1 Тогда
М.Сумма=Д.Итог("СуммаС");
ИначеЕсли Ж.РеквизитТабличнойЧасти("Сумма").Выбран()=1 Тогда
М.Сумма=Д.Итог("Сумма");
КонецЕсли;
КонецЦикла;
//проверка
Если М.КоличествоСтрок()=0 Тогда
Предупреждение("Документы не найдены!");
Возврат(0);
КонецЕсли;
//строка по умолчанию
НомерСтр=0;
Если М.НайтиЗначение(Значение,НомерСтр,"Документ")=0 Тогда
НомерСтр=М.КоличествоСтрок();
КонецЕсли;
//выбор
Заголовок=Метаданные.Документ(ВидДокумента).Представление()+": "+Клиент.Наименование;
Если М.ВыбратьСтроку(НомерСтр,Заголовок)=1 Тогда
Значение=М.ПолучитьЗначение(НомерСтр,"Документ");
Возврат(1);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
Предопределённые функции и процедуры в 1С
Код Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг,Таблица,Адрес)
Перем Ответ;
Перем Ко;
Если ПустоеЗначение(Значение)=1 Тогда
Предупреждение("Невозможно обработать значение ячейки!");
ИначеЕсли ТипЗначенияСтр(Значение)="Документ" Тогда
Если гПользователь.ФлагСписок=0 Тогда
Флаг=1;
Иначе
А=СоздатьОбъект("СписокЗначений");
А.ДобавитьЗначение(0,"Открыть документ");
А.ДобавитьЗначение(1,"Открыть в журнале документов");
Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
Если Ответ=0 Тогда
Флаг=1;
Иначе
Журнал=Метаданные.Документ(Значение.Вид()).Журнал.Идентификатор;
ОткрытьФорму("Журнал."+Журнал+".Основная",Ко);
Ко.АктивизироватьОбъект(Значение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(Значение)="Справочник" Тогда
Если гПользователь.ФлагСписок=0 Тогда
Флаг=1;
Иначе
А=СоздатьОбъект("СписокЗначений");
А.ДобавитьЗначение(0,"Открыть элемент");
А.ДобавитьЗначение(1,"Открыть в списке справочника");
Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
Если Ответ=0 Тогда
Флаг=1;
Иначе
Журнал=Метаданные.Справочник(Значение.Вид()).ОсновнаяФорма;
ОткрытьФорму("Справочник."+Значение.Вид()+"."+Журнал,Ко);
Ко.АктивизироватьОбъект(Значение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(Значение)="СписокЗначений" Тогда
//расшифровка - СписокЗначений
Кнопка=Значение.Получить("Кнопка");
Если Число(Кнопка)=0 Тогда
Значение.СортироватьПоПредставлению();
//обработка - Ячейка
Представление="";
А=СоздатьОбъект("СписокЗначений");
Для i=1 По Значение.РазмерСписка() Цикл
Отчет=Значение.ПолучитьЗначение(i,Представление);
Если ПустаяСтрока(Отчет)=1 Тогда
Продолжить;
ИначеЕсли Лев(Представление,4)="Меню" Тогда
//элемент контекстного меню в ячейке
Позиция=Найти(Отчет,"|");
Если Позиция=0 Тогда
Представление=Метаданные.Отчет(Отчет).Представление();
Иначе
Добавка=Сред(Отчет,Позиция+1);
Отчет=Лев(Отчет,Позиция-1);
Представление=Метаданные.Отчет(Отчет).Представление()+": "+Добавка;
КонецЕсли;
А.ДобавитьЗначение(Отчет,Представление);
КонецЕсли;
КонецЦикла;
//контекстное меню в ячейке
Если А.РазмерСписка()>0 Тогда
Если А.ВыбратьЗначение(Ответ,,,,1)=1 Тогда
Значение.Выгрузить(гПакет);
гПакет.Установить("Таблица","");
ОткрытьФормуМодально("Отчет."+Ответ,1+гПользователь.ФлагОтчет);
КонецЕсли;
КонецЕсли;
Иначе
//обработка - Кнопка
Значение.Выгрузить(гПакет);
гПакет.Установить("Таблица",Таблица);
Отчет=Значение.Получить("Отчет");
ОткрытьФормуМодально("Отчет."+Отчет,Кнопка);
гПакет.Установить("Таблица","");
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(Значение)="Строка" Тогда
Если ВРег(Лев(СокрЛП(Значение),6))="ССЫЛКА" Тогда
СтрокаЗапуска=СокрЛП(Сред(Значение,7));
ЗапуститьПриложение(СтрокаЗапуска);
Иначе
Флаг=1;
КонецЕсли;
Иначе
//расшифровка - Стандартная обработка ячейки
Флаг=1;
КонецЕсли;
КонецПроцедуры
Налоговый учёт и первое событие в 1С
Код //функция определяет сумму первого события за период по заданным остаткам на начало и конец периода
Функция гПервоеСобытие(НачД,НачК,КонД,КонК) Экспорт
//первое событие
СуммаД=Макс(КонД-НачД,0);
СуммаК=Макс(КонК-НачК,0);
//сумма
Возврат(СуммаД+СуммаК);
КонецФункции
Резюме
В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
Внимание! Если у вас не получилось найти нужную информацию, используйте
рубрикатор или воспользуйтесь
поиском .
книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать