Every day, managers spend up to an hour preparing a single contract: copying details from CRM into Word, checking TINs, inserting amounts. With active sales, a queue of 10–15 documents means hours of pure routine. Errors are inevitable: wrong TIN, expired date, missing amount. A single mistake can cost up to 50,000 rubles due to a lost deal.
Developing a custom contract template system for Bitrix24 solves this: generation takes 1–2 minutes, and data is automatically pulled from the deal. Our solution, built on 10+ years of implementation experience, supports conditional logic, product item loops, and e-signature integration—all within a single CRM interface. With 50 contracts per month, this frees up an entire employee position and eliminates manual copy errors. Typical savings on operational costs exceed 240,000 rubles per year per manager.
Unlike Bitrix24's built-in generator, which only replaces variables, a custom solution enables complex conditions and automatic calculation of taxes, discounts, and totals. This is especially important for B2B companies with different client types (legal entities, individuals, with or without VAT).
How to Automate Contract Generation with Conditional Logic?
Deep template customization relies on combining Bitrix24's REST API and the PhpWord library. We create DOCX templates with variable placeholders, then a PHP script processes the deal data and generates the final document. A typical generator code:
use PhpOffice\PhpWord\TemplateProcessor;
function generateContract($dealId, $templatePath) {
$deal = CRest::call('crm.deal.get', ['id' => $dealId])['result'];
$contact = CRest::call('crm.contact.get', ['id' => $deal['CONTACT_ID']])['result'];
$company = CRest::call('crm.company.get', ['id' => $deal['COMPANY_ID']])['result'];
$template = new TemplateProcessor($templatePath);
$template->setValue('CONTRACT_NUMBER', generateContractNumber($dealId));
$template->setValue('CONTRACT_DATE', date('d.m.Y'));
$template->setValue('CLIENT_NAME', $company['TITLE']);
$template->setValue('AMOUNT', number_format($deal['OPPORTUNITY'], 2, '.', ' '));
if ($deal['UF_CRM_VAT'] === 'Y') {
$template->setValue('VAT_BLOCK', 'including VAT 20%: ' . number_format($deal['OPPORTUNITY'] * 0.2, 2));
} else {
$template->setValue('VAT_BLOCK', 'VAT not applicable');
}
$outputPath = '/tmp/contract_' . $dealId . '.docx';
$template->saveAs($outputPath);
return $outputPath;
}
Additionally, we implement a "Generate Contract" button directly in the deal card via a placement app. After generation, the file is automatically attached to the deal, and an activity is logged in the timeline. The entire process takes seconds.
What Benefits Does E-Signature Integration Bring?
After internal approval through business processes, the contract is sent to the client for signing. We integrate services like Kontur.Sign or SBIS. Signing status is synced with CRM: if the client rejects, the deal returns for revision; if signed, the contract is archived. This shortens the deal closing cycle from weeks to 1–2 days. According to Bitrix24 Helpdesk, document workflow automation reduces contract processing time by 60%.
When Does Custom Template Implementation Pay Off?
Payback occurs in less than 3 months by eliminating manual labor and errors. For companies with 30+ contracts per month, the implementation cost is recovered within the first quarter. Additional benefits include faster deal cycles and improved document accuracy.
What's Included in the Work: Deliverables
Upon project completion, you receive:
- A fully functional contract generator based on your DOCX templates.
- Documentation for setup and support (description of variables, logic, REST API).
- Access to the source code in a Git repository.
- Manager training (2–3 sessions of 1 hour each).
- Code warranty — 3 months of free support after deployment.
Process and Timelines
Our work covers the full cycle:
| Stage |
Duration |
| Analytics: review current templates, identify all contract types |
2–3 days |
| Design: map variables and branching logic |
2–3 days |
| Development: create DOCX templates with conditional blocks and generator code |
5–10 days |
| Integration: configure placement buttons, approval business processes, and e-signature |
3–5 days |
| Testing: verify on 10–20 scenarios (different deal types, edge amounts) |
2–3 days |
| Deployment and training: upload to production server, train managers |
1–2 days |
Timelines: basic project with one template — from 5 business days. Comprehensive system (5+ templates, branching, e-signature) — 3–4 weeks. Cost is calculated individually after auditing your processes.
Comparison: Built-in Generator vs. Custom Solution
| Feature |
Built-in CRM Module |
Custom Solution |
| Simple templates with variable replacement |
Yes |
Yes |
| Conditional blocks (if/else) |
No |
Yes |
| Product item loops |
No |
Yes |
| Complex calculations |
No |
Yes |
| E-signature |
Requires additional work |
Built-in |
| Approval business processes |
Manual |
Automatic |
A custom solution is 5–10 times more functional than the standard one and completely eliminates routine.
Common Implementation Mistakes
- Overly complex templates: trying to cram all conditions into one file — better split into 2–3 specialized templates.
- Skipping testing: unverified edge values (zero amount, long names) break generation.
- Missing template backups: keep DOCX sources and code in Git.
Contact us for a free consultation and project assessment. Order an audit of your current templates — we will select the optimal turnkey solution within 2 weeks. Get a commercial proposal with exact deadlines and scope of work.
Why does website layout for 1C-Bitrix require professionalism?
Open template.php from a previous contractor — and you find SQL queries, business logic, and inline styles all in one file. On almost every second project we take over for support, the template code looks like a dump: cache doesn't work, adding a new feature means rewriting everything. Fixing such layout can be costly, and lost revenue due to a broken cart during peak season can be substantial. Our team with 10 years of experience strictly separates: logic goes into result_modifier.php or component_epilog.php, presentation into template.php. No CIBlockElement::GetList in templates. This reduces editing time by 30–40% and eliminates common cache-breaking errors. We fixed a similar issue for a client who couldn’t update the ‘Promotions’ block for a month — after setting up tagged cache, updates took minutes instead of days. Want the same results? Get a free audit of your current layout.
How to properly organize component templates?
A custom template is not a single file but a structure of five to six files:
-
template.php — only HTML and output of $arResult
-
result_modifier.php — data preparation, additional queries
-
component_epilog.php — code after caching (counters, dynamic content)
-
style.css and script.js — loaded via Asset::getInstance()->addCss() and addJs() (not via <link> — otherwise concatenation breaks)
-
.parameters.php — visual editor parameters
Example structure for a catalog:
local/templates/your_template/components/bitrix/catalog.section/.default/
├── template.php
├── result_modifier.php
├── component_epilog.php
├── style.css
├── script.js
└── .parameters.php
Typical templates we develop turnkey:
| Component |
What we do |
catalog.section and catalog.element |
View switching (grid/list/table), lazy load for images, srcset for retina |
sale.basket.basket |
AJAX update without reload, mini-cart via sale.basket.basket.line |
menu |
Mega menu with caching by sections, lazy loading of submenus |
search.title |
Autosuggest with 300ms debounce, product previews in dropdown |
breadcrumb |
Microdata BreadcrumbList according to Schema.org |
Caching: why does it break and how do we fix it?
Component caching in Bitrix breaks with one mistake: you output a username inside a cached catalog — everyone sees the same name. Solution — use component_epilog.php for dynamic inserts.
Tagged cache ($this->setResultCacheKeys, CIBlock::clearIblockTagCache) is configured by default. Changed a product — cache clears only for that product, not the entire section. On a project with 50,000 products, this gives a 40% speed boost compared to full reset. Official Bitrix documentation recommends using component_epilog.php for dynamic inserts. Real case. A client complained that everyone saw the same cart on the catalog page. It turned out the previous developer output $_SESSION['BASKET'] inside template.php of the catalog.section component. The component was cached for an hour — the cart was frozen. We moved the output to component_epilog.php and configured tagged cache on sale.basket.basket.line. The page didn’t lose speed, the cart became up-to-date. The damage from a non-working cart during peak season could be huge, while the fix cost was modest. Tagged cache reduces page rebuild time by 50× compared to full reset.
CSS approaches: BEM, Tailwind, or hybrid?
For large projects (30+ templates) we use BEM — .product-card__price, .product-card--featured. Styles are isolated, no conflicts. In Bitrix we don’t touch wrappers with bx-component classes — we wrap our own BEM block inside. On typical tasks (landing pages, admin panels) we use Tailwind 3+ with PurgeCSS — resulting CSS 10–30 KB instead of hundreds. Design tokens in tailwind.config.js lock colors, fonts, spacing in one place. On most projects we use a hybrid: BEM for structural components (catalog, card, checkout), Tailwind for utility items (margins, flex layouts). We agree on the boundary with the team in advance.
How do we achieve Core Web Vitals?
Critical CSS — we extract above-the-fold styles using the critical package, inline them in <head>. The rest loads asynchronously via media="print" onload="this.media='all'". LCP on mobile decreases by 1–1.5 seconds.
Images — the main bottleneck. We use <picture> with WebP and JPEG fallback. loading="lazy" for everything below the fold. width and height explicitly set — CLS = 0. A handler in urlrewrite.php generates WebP on the fly.
Minification and compression. CSS and JS via Vite or Bitrix built-in concatenation. Brotli on nginx (brotli_comp_level 6) — 15–20% more efficient than gzip. Static caching: expires 1y + versioning via query string.
For a catalog of 10,000 products, LCP went from 4.2 s to 2.1 s. Conversions improved by 12% after the speed fix. Want similar results? Order a free audit — we’ll evaluate your current layout and propose specific steps.
Deliverables after layout completion
When you order template development or adaptation, you receive:
- Source files of component templates with separation into
template.php, result_modifier.php, epilog
- CSS and JS loaded via Asset — no inline styles
- Configured caching with tags
- Documentation on structure and parameters
- Access to a Git repository with change history
- Training for your developer: how to edit the template without losing upgradeability
We guarantee Core Web Vitals compliance and cross-browser compatibility. Each project is assigned a lead engineer with 10+ years of Bitrix experience.
Process:
- Analysis of mockups and current project — identify components for rework
- Structure design — break the page into BEM blocks
- Implementation — build templates according to the scheme: template, result_modifier, epilog, CSS, JS
- Testing — check cache, responsiveness, Core Web Vitals, cross-browser compatibility
- Deployment — staging, acceptance, production
At each stage you get intermediate results and can make corrections. Contact our team for a project estimate — we’ll provide a timeline and cost within 1–2 days after receiving mockups.
Common mistakes in Bitrix layout
- SQL queries inside
template.php — breaks caching and creates heavy load
- Inline
<style> and <script> — breaks Asset concatenation and slows loading
- Missing
result_modifier.php — logic mixed with presentation
- Direct
$_REQUEST in cached components — user-specific data leaks
- Not using
component_epilog.php for dynamic content — entire cache invalidated on each user action
Each mistake has a simple fix — we correct them during development or audit.
Timelines
| Scope |
Timeline |
| Landing page (5–7 screens) |
3–5 days |
| Corporate website (15–20 unique pages) |
2–4 weeks |
| E-commerce store (30+ component templates) |
4–8 weeks |
| Customization of a Marketplace solution |
1–3 weeks |
| Redesign of an existing project |
3–6 weeks |
Ready to improve your layout? Order a preliminary consultation — we’ll calculate timelines and budget individually.